# LC 153. Find Minimum in Rotated Sorted Array ### [Problem link](https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/) ###### tags: `leedcode` `python` `c++` `medium` `Binary Search` Suppose an array of length <code>n</code> sorted in ascending order is **rotated** between <code>1</code> and <code>n</code> times. For example, the array <code>nums = [0,1,2,4,5,6,7]</code> might become: - <code>[4,5,6,7,0,1,2]</code> if it was rotated <code>4</code> times. - <code>[0,1,2,4,5,6,7]</code> if it was rotated <code>7</code> times. Notice that **rotating** an array <code>[a[0], a[1], a[2], ..., a[n-1]]</code> 1 time results in the array <code>[a[n-1], a[0], a[1], a[2], ..., a[n-2]]</code>. Given the sorted rotated array <code>nums</code> of **unique** elements, return the minimum element of this array. You must write an algorithm that runs in<code>O(log n) time.</code> **Example 1:** ``` Input: nums = [3,4,5,1,2] Output: 1 Explanation: The original array was [1,2,3,4,5] rotated 3 times. ``` **Example 2:** ``` Input: nums = [4,5,6,7,0,1,2] Output: 0 Explanation: The original array was [0,1,2,4,5,6,7] and it was rotated 4 times. ``` **Example 3:** ``` Input: nums = [11,13,15,17] Output: 11 Explanation: The original array was [11,13,15,17] and it was rotated 4 times. ``` **Constraints:** - <code>n == nums.length</code> - <code>1 <= n <= 5000</code> - <code>-5000 <= nums[i] <= 5000</code> - All the integers of <code>nums</code> are **unique** . - <code>nums</code> is sorted and rotated between <code>1</code> and <code>n</code> times. ## Solution 1 - Binary Search #### Python ```python= class Solution: def findMin(self, nums: List[int]) -> int: left, right = 0, len(nums) - 1 while left < right: mid = (left + right) // 2 if nums[mid] < nums[right]: right = mid else: left = mid + 1 return nums[left] ``` #### C++ ```cpp= class Solution { public: int findMin(vector<int>& nums) { int n = nums.size(); int left = 0; int right = n - 2; while (left <= right) { int mid = left + (right - left) / 2; if (nums[mid] > nums[n - 1]) { left = mid + 1; } else { right = mid - 1; } } return nums[left]; } }; ``` >### Complexity >n = nums.length >| | Time Complexity | Space Complexity | >| ----------- | --------------- | ---------------- | >| Solution 1 | O(logn) | O(1) | ## Note sol1: 每次都跟最後一個相比, 來判斷left, right的區間. [Ref](https://hackmd.io/@Alone0506/rJd4JUe8C)