美團面試題:尋找數組置尾操作的最小值

題目:
一個遞增的整形數組,現在的操作是每次從數組的開頭取出一個元素放在數組的末尾,連續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;
}



發佈了212 篇原創文章 · 獲贊 34 · 訪問量 42萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章