Suppose a sorted array 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.
思路:1.确认是否为rotated sorted array 如果是且num[mid] > num[right] 表明最小值在mid的右边,如果num[mid] < num[right] 表明最小值在mid的左边。
2.如果不是rotated sorted array 则为普通的sorted array, 则最小值在mid的左边。
1 public class Solution { 2 /** 3 * @param num: a rotated sorted array 4 * @return: the minimum number in the array 5 */ 6 public int findMin(int[] num) { 7 int left = 0; 8 int right = num.length - 1; 9 while (left + 1 < right) { 10 int mid = left + (right - left) / 2; 11 if (num[left] > num[right] && num[mid] > num[right]) { 12 left = mid + 1; 13 } else if (num[left] > num[right] && num[mid] < num[right]){ 14 right = mid; 15 } else if (num[left] < num[right]) { 16 right = mid; 17 } 18 } 19 if (num[left] < num[right]) { 20 return num[left]; 21 } else { 22 return num[right]; 23 } 24 } 25 }
1 public class Solution { 2 /** 3 * @param num: a rotated sorted array 4 * @return: the minimum number in the array 5 */ 6 public int findMin(int[] nums) { 7 if (nums == null || nums.length == 0) { 8 return -1; 9 } 10 11 int start = 0, end = nums.length - 1; 12 int target = nums[nums.length - 1]; 13 14 // find the first element <= target 15 while (start + 1 < end) { 16 int mid = start + (end - start) / 2; 17 if (nums[mid] <= target) { 18 end = mid; 19 } else { 20 start = mid; 21 } 22 } 23 if (nums[start] <= target) { 24 return nums[start]; 25 } else { 26 return nums[end]; 27 } 28 } 29 }