一個遞增的整形數組,現在的操作是每次從數組的開頭取出一個元素放在數組的末尾,連續n次這樣的操作後得到一個新的數組,
現在把這個數組給你,請求出最少移動的次數。
解析:
1 最容易想到的方法就是依次遍歷這個數組,找到最小值的位置,這樣的時間複雜度就是O(n)。
2 考慮到事先是排好序的,所以我們可以使用二分查找法來實現這個操作,只不過是這個二分查找法是傳統二分查找法的變種。
這裏我們只要考慮以下3種情況。
<1>數組先遞增再遞減,中值大於左值,那麼此時的最小值就處於數組的右半部。
<2>數組先遞增再遞減,中值小於左值,那麼此時的最小值就處於數組的左半部。
<3>數組單調遞增,此時的最小值就是數組的首元素。
3 程序實現
根據解析中2的思想,採取二分查找法的程序如下所示:
#include <iostream>
using namespace std;
int getInvertNumber(int arr[],int nLength);
void main()
{
int arr[] = {1,2,3,4,5,6,7,8,9};
int brr[] = {1,3,4,6,8,9};
int sb = getInvertNumber(brr,sizeof(brr)/sizeof(brr[0]));
cout<<sb<<endl;
}
int getInvertNumber(int arr[],int nLength)
{
int nLeft = 0;
int nRight = nLength-1;
int nMid;
if(arr[nLeft]<arr[nRight])
return 0;
while(nLeft<nRight)
{
nMid = ( nLeft + nRight ) / 2;
if(arr[nMid]>arr[nLeft])
nLeft = nMid;
else
nRight = nMid;
}
return nLength -nMid-1;
}