liuxuhelloworld's notebook

题目链接

https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array/

解答过程

这个题目和Problem33几乎一样,Problem33是查找特定值,Problem153是查找最小值,都是基于rotation破坏有序性做文章。在Problem33的经验之上,我们可以很容易判断mid节点是在左侧上升段还是右侧上升段。不过Problem153还有一点不同,就是可能rotation后还是全部有序的。正因为这一点,比较nums[mid]和nums[left]的大小关系不足以确认最小值在左侧还是右侧。比如,nums[mid] > nums[left],如果是Problem33的背景下,那么mid节点一定是在左侧上升段,即最小值在右侧。但是,由于Problem153可能rotation后和原数组一样,那么此时,同样nums[mid] > nums[left],但是最小值在左侧。因此,和nums[left]比较没有用。相反的,nums[mid]和nums[right]的大小关系就可以确认最小值在左侧还是右侧: nums[mid] > nums[right],最小值在右侧,nums[mid]不会是最小值,left=mid+1后继续; nums[mid] < nums[right],最小值在左侧,nums[mid]可能是最小值,right=mid后继续。

	public int findMin(int[] nums) {
		int left = 0, 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[right]) {
				right = mid;
			}
		}

		return nums[left];
	}

相似题目