[LeetCode] 153. Find Minimum in Rotated Sorted Array
Medium
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., [0,1,2,4,5,6,7]
might become [4,5,6,7,0,1,2]
).
Find the minimum element.
You may assume no duplicate exists in the array.
Example 1:
Input: [3,4,5,1,2] Output: 1
Example 2:
Input: [4,5,6,7,0,1,2] Output: 0
题目大意:给出一个升序排列的子数列,但是子数列进行了未知的循环移动,例如升序排列的[0,1,2,3,4,5,6,7]经过未知循环移动后变成了[4,5,6,7,0,1,2,3]。找出数列中的最小元素。
方法:
二分法。尽管数列进行了循环移动,但是整体数列还是升序排列的。首先判断数列是否进行了循环位移。判断首尾元素大小。如果首元素较小,说明数列没有位移,数列整体为升序排列,那么首元素既是数列的最小值。
当数列进行了未知的循环位移后:设定一个当前可知的最小值。如果中间元素值比这个最小值小,那么最小值在左区域,将中间值设置为右边界。如果中间元素值比最小值大,说明最小值在右区域,将中间值设置为左边界。循环直至左右边界中间不再存在元素。
代码如下:
class Solution { public: int findMin(vector<int>& nums) { if(nums[0]<nums[nums.size()-1])return nums[0]; int len=nums.size(); int t=nums[len-1]; int left=0,right=len-1; while(left<right-1){ int mid=left+(right-left)/2; if(nums[mid]>t){ left=mid; } else{ right=mid; t=nums[mid]; } } return t; } };
从代码可以看出,其实当前的最小值一直都是右边界处的值,所以可以将代码进行简化:
class Solution { public: int findMin(vector<int>& nums) { if(nums[0]<nums[nums.size()-1])return nums[0]; int len=nums.size(); int left=0,right=len-1; while(left<right-1){ int mid=(right+left)/2; if(nums[mid]>nums[right]){ left=mid; } else{ right=mid; } } return nums[right]; } };
emmm其实对于时间和空间都并没有带来什么大的变化。