二分法 03

88 阅读1分钟

LeetCode 剑指 11

leetcode-cn.com/problems/xu…

解题思路:

由题可得,旋转后的数组可分为两组,分别都是有序的。旋转后的数组的最右边的元素,肯定是右边组的最大的数,与中间数比较。

1.mid < right(右边最大),则最小值在左半边
right = mid, 有可能mid本身就是最小值

2.mid > right,则最小值在右半边
left = mid + 1,mid本身不可能是最小值

3.mid == right,说明数组出现了相同的数,只能right--,强行缩小数组的范围,
然后接下来再进行缩小二分查找了

当right与left mid重合到一个元素时,跳出while,则找到了最小值

代码如下:

/**
 * 二分法
 */
class Solution {
	public int minArray(int[] numbers) {
		int left = 0, right = numbers.length - 1;
		while(left < right) {
			int mid = left + ((right - left) >> 1);
			if(numbers[mid] < numbers[right]) {
				right = mid;
			} else if (numbers[mid] > numbers[right]) {
				left = mid + 1;
			} else {
				right --;
			}
		}
		return numbers[left];
	}

	public static void main(String[] args) {
		Solution k = new Solution();
		int[] a = new int[] { 3, 4, 5, 1, 2 };
		System.out.println(k.minArray(a));
	}
}