找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 2805|回复: 0

【算法】找出数组置尾操作的次数

[复制链接]
发表于 2015-1-29 05:17:29 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
题目:
一个递增的整形数组,现在的操作是每次从数组的开头取出一个元素放在数组的末尾,连续n次这样的操作后得到一个新的数组,现在把这个数组给你,请求出最少移动的次数。
解析:
1 最容易想到的方法就是依次遍历这个数组,找到最小值的位置,这样的时间复杂度就是O(n)。
2 考虑到事先是排好序的,所以我们可以使用二分查找法来实现这个操作,只不过是这个二分查找法是传统二分查找法的变种。
这里我们只要考虑以下3种情况。
<1>数组先递增再递减,中值大于左值,那么此时的最小值就处于数组的右半部。
<2>数组先递增再递减,中值小于左值,那么此时的最小值就处于数组的左半部。
<3>数组单调递增,此时的最小值就是数组的首元素。

3 程序实现
根据解析中2的思想,采取二分查找法的程序如下所示:
  1. #include <iostream>
  2. using namespace std;
  3. int getInvertNumber(int arr[],int nLength);

  4. void main()
  5. {
  6.         int arr[] = {1,2,3,4,5,6,7,8,9};
  7.         int brr[] = {1,3,4,6,8,9};
  8.         int sb = getInvertNumber(brr,sizeof(brr)/sizeof(brr[0]));
  9.         cout<<sb<<endl;

  10. }

  11. int getInvertNumber(int arr[],int nLength)
  12. {
  13.         int nLeft = 0;
  14.         int nRight = nLength-1;
  15.         int nMid;
  16.         if(arr[nLeft]<arr[nRight])
  17.                 return 0;
  18.         while(nLeft<nRight)
  19.         {
  20.                 nMid = ( nLeft + nRight ) / 2;
  21.                 if(arr[nMid]>arr[nLeft])
  22.                         nLeft = nMid;
  23.                 else
  24.                         nRight = nMid;
  25.         }

  26.         return nLength -nMid-1;
  27. }
复制代码
回复

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-22 02:44 , Processed in 0.036166 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表