leetcode 704. 二分查找 - 力扣(LeetCode)
解题思路:
| 思路 | 问题 | 改进 |
|---|---|---|
| 二分法 | 左右区间更新 | left和right指针 |
| while(left<right) | 什么时候停止更新 | left或者right指针的值==target |
| 返回值 | 存在返回下标,否则返回-1 |
代码:
// 写法一
class Solution {
public int search(int[] nums, int target) {
// [left,right) 左闭右开
int len = nums.length;
int left = 0;
int right = len - 1 + 1;
while(left < right) {
int mid = (left + right) / 2;
if(nums[mid] < target) {
// update left
left = mid + 1;
}else if(nums[mid] > target) {
// update right
right = mid;
}else {
return mid;
}
}
return -1;
}
}
// 写法二
class Solution {
public int search(int[] nums, int target) {
// [left,right) 左闭右闭
int len = nums.length;
int left = 0;
int right = len - 1;
while(left <= right) {
int mid = (left + right) / 2;
if(nums[mid] < target) {
// update left
left = mid + 1;
}else if(nums[mid] > target) {
// update right
right = mid - 1;
}else {
return mid;
}
}
return -1;
}
}
总结
二分查找法首先需要明确思路,即向接近值靠拢的更新规则
写代码时需要处理的问题是区间的边界,解决方法是抓住不变量,固定区间的左右边界条件(左闭右闭/左开右闭/左闭右开),选择其中一种即可