二分查找------练习1
1. 题目
2. 思路和题解
这道题和81题其实很像,也是用二分查找进行求解。也是需要在原二分查找的基础上缩减范围。
- 首先和二分查找大体思路一样,分别定义左右两个位置left和right,然后mid为left + (right - left) / 2
- 接下来就是三种情况:
- 如果中间值大于右边的值,即numbers[mid] > numbers[right],这个时候说明最小值肯定在mid的右边,所以将mid + 1赋值给left
- 如果中间值小于右边的值,即numbers[mid] < numbers[right],这个时候说明最小值肯定在mid的左边,但是这里不能像上面一样,将mid - 1赋值给right,因为mid这个位置的元素可能就是最小的,所以不能直接排除,需要先留下来
- 如果中间值等于右边的值,即numbers[mid] = numbers[right],这个时候虽然没办法像上面一样确定最小值在mid的左边还是右边,但是我们可以将right值减1,这样起到缩小范围的作用,并且没有将mid排除,所以对结果是没有影响的
所以整体的代码如下:
class Solution {
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[right]) {
right = mid;
} else {
right--;
}
}
return nums[left];
}
}