旋转数组最小值II
题目
一个有序的数组,在从某一个位置开始,旋转到数组的另一端
举例:
0 1 2 3 4 5 6 -> 4 5 6 0 1 2 3
在这个变换之后的数组中,找到最小值。
注意:
分析
之前分析过没有重复的情况,最主要的有两点:
- 考虑完全思路
- 找好切入点
其实这两点是相关的,一个好的切入点,有利于覆盖完全的思路。这里的切入点可能有,用left,right,mid表示数组的左右中索引:
- left和mid的数组值关系
- left和right的数组值关系
right和mid是一样的,那个入手好呢?见下图

left和right的关系少,而且简单。我们不妨从这个开始判断。
其实Leetcode上有问到,有什么变化?其实变化就在于num[left]==num[mid]==num[right]的时候,需要两边都要考虑,不能只考虑一边。
对照着上面的图,大家仔细体会。和图一样粗糙的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| public class Solution { public int min(int a, int b) { if (a < b) return a; return b; } public int findMin(int[] num, int left, int right) { while(left < right) { if (num[left] < num[right]) { return num[left]; } int mid = (left + right) / 2; if (num[left] < num[mid]) { left = mid + 1; } else if (num[left] > num[mid]) { right = mid; } else { return min(findMin(num, left, mid), findMin(num, mid + 1, right)); } } return num[left]; } public int findMin(int[] num) { return findMin(num, 0, num.length - 1); } }
|