描述
有一個長度為 n 的非降序數組,比如[1,2,3,4,5],將它進行旋轉,即把一個數組最開始的若干個元素搬到數組的末尾,變成一個旋轉數組,比如變成了[3,4,5,1,2],或者[4,5,1,2,3]這樣的。請問,給定這樣一個旋轉數組,求數組中的最小值。
數據范圍: 1≤n≤100001≤n≤100001≤n≤10000,數組中任意元素的值: 0≤val≤100000≤val≤100000≤val≤10000
要求:空間復雜度:O(1)O(1)O(1) ,時間復雜度:O(logn)O(logn)O(logn)
示例1
輸入:[3,4,5,1,2]
返回值:1
示例2
輸入:[3,100,200,3]
返回值:3
方法:
問題性質??:旋轉數組由兩個遞增子數組組成(如 [3,4,5,1,2])。最小值位于第二個子數組的首位(旋轉點)。
??二分查找??:通過比較中間元素與右邊界元素,逐步縮小搜索范圍。
??重復元素處理??:當中間值等于右邊界值時,通過 right–跳過重復項,避免錯誤分區。
class Solution {
public:/*** 代碼中的類名、方法名、參數名已經指定,請勿修改,直接返回方法規定的值即可** * @param nums int整型vector * @return int整型*/int minNumberInRotateArray(vector<int>& nums) {// write code hereint left = 0;int right = nums.size() - 1;while(left < right){int mid = (left + right) / 2;if(nums.at(mid) > nums.at(right)){left = mid + 1;}else if(nums.at(mid) < nums.at(right)){right = mid;}else{right--;}}return nums.at(left);}
};