題目:把乙個陣列中最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。
例如陣列為的乙個旋轉陣列,該陣列的最小值為1。
這樣描述問題的話,就很容易解決了。同樣,我們需要想到解決這個問題的時間複雜度,第一眼看到這個題目的時候,想必第一反應就是從頭到尾的遍歷這個陣列,
時間複雜度為o(n),很容易的就解決了。然而這肯定不是面試官想要的答案,我們需要把時間複雜度降低,於是很容易的就想到了o(logn),於是又很容易的想到了二分查詢。
利用二分查詢的思想,將指標p1,p2分別指向陣列中的第乙個元素和最後乙個元素。找到p1,p2中間的乙個元素,若這個元素大於p1所指向的元素,說明這個元素在第乙個遞增序列裡,我們再令p1指向這個元素。若這個元素小於p2,說明這個元素在第二個遞增序列裡,我們就令p2指向這個元素。將這個操作不停的迴圈下去,當p1和p2指向的元素相鄰時,表明p1指向的是第乙個序列中最大的元素,p2指向的是第二個序列中最小的元素,即是我們需要找到的整個序列中最小的元素。
int findmin(int data, int length)
return data[p2];
}
面試題8 旋轉陣列的最小數字
題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。輸入 輸入可能包含多個測試樣例,對於每個測試案例,輸入的第一行為乙個整數n 1 n 1000000 代表旋轉陣列的元素個數。...
面試題8 旋轉陣列的最小數字
旋轉陣列的最小數字 問題描述 將乙個嚴格遞增的數字序列從第i個位置切分,將有半部分挪到左半部分,比如 1,2,3,4,5,6 3,4,5,6,1,2 輸出序列中最小的數字的位置 笨方法是從左到右掃瞄一遍,但是o n 的複雜度肯定是不行的。根據問題描述的性質可知,變換後的序列的第乙個數是大於最後乙個數...
面試題8 旋轉陣列的最小數字
1.題目 把乙個陣列最開始的幾個數字移到陣列的末尾,稱為陣列的旋轉,輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1.分析 最簡單的解法是從左到右遍歷陣列,找出最小的,但是時間複雜度是o n 沒有利用上排序的特性。乙個遞增的排序陣列在旋轉之後,也是部...