# 153. Find Minimum in Rotated Sorted Array ## 問題 有一個array原本是由大到小排序過的,經過旋轉後,找出array中的最小值 ``` Example 1: Input: nums = [3,4,5,1,2] Output: 1 是 [1,2,3,4,5] rotated 3 times. ``` ## Idea 用Binary Search 1. 每次都去去看在中間的數值 2. 如果位在中間的數值大於最右邊的數值,代表這個array有被旋轉,最小值在右邊區塊 -> `l=mid+1` 3. 如果位在中間的數值小於最右邊的數值,代表這個array沒旋轉,最小值在左邊區塊 -> `r=mid` 4. 直到做又指標不是這樣的關係 `l<r` ``` nums = [3,4,5,1,2] l=0,r=4 mid = (0+4)/2 = 2 [3,4,5,1,2] ^mid l=3,r=4 mid = (3+4)/2 = 3 [3,4,5,1,2] ^mid l=3, r=3 ``` >:bulb:因為如果直接排序會造成 $O(NlogN)$ 時間複雜度 >```cpp >int findMin(vector<int>& nums) { > ranges:: sort(nums); > return nums[0]; >} >``` ## Solution 1 時間複雜度=O(logN); 空間複雜度=O(1) ```cpp int findMin(vector<int>& nums) { int n=nums.size(); int l=0, r=n-1; while(l<r){ int mid = (l+r)/2; if(nums[mid] > nums[r]){ l = mid + 1; }else{ r = mid; } } return nums[l]; } ``` ## Solution 2 時間複雜度=O(N); 空間複雜度=O(1) **找到結尾和起始點的接口** ```cpp nt findMin(vector<int>& nums) { int pivot = nums[0]; for(int i=1; i<nums.size(); i++){ if(pivot>nums[i]){ return nums[i]; } pivot = nums[i]; } if(pivot > nums[0])return nums[0]; return pivot; } ```