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.
题目链接:https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/
题目分析:每次二分的值和最左最右端点比较就可以知道当前二分点在左区间还是右区间,答案就是右区间的第一个值
public class Solution {
public int findMin(int[] nums) {
int n = nums.length;
int l = 0, r = n - 1, mid, pos = 0;
while (l <= r) {
mid = (l + r) >> 1;
if (nums[mid] >= nums[0]) {
l = mid + 1;
}
else if (nums[mid] <= nums[n - 1]) {
if (mid > 0 && nums[mid] < nums[mid - 1]) {
pos = mid;
}
r = mid - 1;
}
}
return nums[pos];
}
}
以上的写法非常的丑,也可以这样写,目的就是要找右区间的第一个值,若二分值大于当前右端点值,则只可能是二分点在左区间,右端点在右区间,这时将左端点右移,否则此时左右中三个端点必然都在右区间了,不断向左移动右端点即可。
public class Solution {
public int findMin(int[] nums) {
int l = 0, r = nums.length - 1, mid;
while (l < r) {
mid = (l + r) >> 1;
if (nums[mid] > nums[r]) {
l = mid + 1;
}
else {
r = mid;
}
}
return nums[l];
}
}