假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7]
可能变为 [4,5,6,7,0,1,2]
)。
请找出其中最小的元素。
注意数组中可能存在重复的元素。
示例 1:
输入: [1,3,5]
输出: 1
示例 2:
输入: [2,2,2,0,1]
输出: 0
代码实现一:
public int findMin(int[] nums) { int left = 0; int right = nums.length - 1; while (left <= right) { int mid = left + (right - left) / 2; if (nums[mid] > nums[right]) left = mid + 1; else if (nums[mid] < nums[left]) right = mid; else right--; } return nums[left]; }
代码实现二 :与寻找旋转排序数组中的最小值类似的解法
public int findMin(int[] nums) { if (nums.length == 1) return nums[0]; if (nums.length == 2) return nums[0] < nums[1] ? nums[0] : nums[1]; if (nums[0] < nums[nums.length - 1]) return nums[0]; int left = 0; int right = nums.length - 1; int min = nums[0]; while (left <= right) { int mid = left + (right - left) / 2; if (mid >= 1 && (mid + 1) < nums.length && nums[mid] < nums[mid + 1] && nums[mid] < nums[mid - 1]) return nums[mid]; else if (left >= 1 && (left + 1) < nums.length && nums[left] < nums[left - 1] && nums[left] < nums[left + 1]) return nums[left]; else if (right >= 1 && (right + 1) < nums.length && nums[right] < nums[right - 1] && nums[right] < nums[right + 1]) return nums[right]; else if (nums[mid] > nums[0]) { if (nums[mid] < min) min = nums[mid]; left = mid + 1; } else if (nums[mid] < nums[0]) { if (nums[mid] < min) min = nums[mid]; right = mid - 1; } else { if (nums[mid] < min) min = nums[mid]; left++; } } if (min > nums[nums.length - 1]) min = nums[nums.length - 1]; if (min > nums[1]) min = nums[1]; if (min > nums[nums.length - 2]) min = nums[nums.length - 2]; return min; }
主函数:
public static void main(String[] args) { S6 s = new S6(); int[] res1 = new int[]{1,3,5}; int[] res2 = new int[]{2,0,0,0,1,2}; int[] res3 = new int[]{2,2,2,0,1}; System.out.println(s.findMin(res1)); System.out.println(s.findMin(res2)); System.out.println(s.findMin(res3)); }
运行结果:
1
0
0