劍指offer11:旋轉數組的最小數字

題目

把一個數組最開始的若干個元素搬到數組的末尾,我們稱之爲數組的旋轉。 輸入一個非減排序的數組的一個旋轉,輸出旋轉數組的最小元素。 例如數組{3,4,5,1,2}爲{1,2,3,4,5}的一個旋轉,該數組的最小值爲1。
NOTE:給出的所有元素都大於0,若數組大小爲0,請返回0。

思路

對於有序或者部分有序的數組,使用二分查找

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        if (rotateArray.empty()) return 0;
	int left = 0, right = rotateArray.size() - 1;
	int mid = 0;
	while (rotateArray[left] >= rotateArray[right] && left < right) {
		mid = (left + right) / 2;
		if (rotateArray[mid] >= rotateArray[left]) left = mid + 1;
		else if (rotateArray[mid] <= rotateArray[left]) right = mid;
	}
	return rotateArray[left];
    }
};

問題

這是在牛客上通過了的代碼。但是我不清楚測試用例到底是純遞增數組,還是如題所述的非減排序(包含重複的元素)。因爲如果使用[3,4,2,3,3,3,3],這段代碼會返回3,則結果錯誤。
對於 rotateArray[mid] = rotateArray[left] = rotateArray[right] 的情況,我始終想不出好的解決方案,無法判斷二分法下一步應該往右子數組還是左子數組。
有哪位大神有什麼好的解決方法嗎!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章