Description:
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.
算法分析:
4 5 6 7 0 1 2
|
| |
| | |
| | | |
| | | |
| | | | |
| | | | | |
找旋转数组的起点,实际上类似找一个山谷,只要两边都比中间高就对了,这和Find Peak Element这题很像。
我们不断地取中点,找左右两侧较小的那一侧,直到找到一个点比左右两边都低。
代码如下:
public class Solution { public int findMin(int[] nums) { for(int min = 0, max = nums.length - 1, mid = max / 2; min <= max; mid = (min + max)/2){ // 如果找到最左边,返回较小的那个 if(mid == 0) return Math.min(nums[mid],nums[max]); // 如果找到最右边,返回较小的那个 if(mid == nums.length - 1) return Math.min(nums[mid],nums[min]); // 如果两边都比中间高,返回中间那个 if(nums[mid] < nums[mid-1] && nums[mid] < nums[mid+1]) return nums[mid]; // 否则,继续搜索较小的那一半,找到低谷 if(nums[mid] > nums[max]){ min = mid + 1; } else { max = mid - 1; } } return nums[0]; } }