数据结构与算法--二分查找
作者:互联网
数据结构与算法–二分查找
二分查找前提
有序数组,数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件。
二分查找的边界问题
左闭右闭:
- 我们定义 target 是在一个在左闭右闭的区间里,也就是[left, right] (这个很重要非常重要)。区间的定义这就决定了二分法的代码应该如何写,因为定义target在[left, right]区间。
- while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=
- if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1
左闭右开
- 如果说定义 target 是在一个在左闭右开的区间里,也就是[left, right) ,那么二分法的边界处理方式则截然不同。
- while (left < right),这里使用 < ,因为left == right在区间[left, right)是没有意义的。
- if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]。
704. 二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在nums 中因此返回 -1
python
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
l = 0
r = len(nums) # 左闭右开区间,不是左闭右闭区,算法截然不同
while(l < r):
mid = (l + r) // 2
if(target > nums[mid]):
l = mid + 1
elif(target < nums[mid]):
r = mid
else:
return mid
return -1
class Solution:
def search(self, nums: List[int], target: int) -> int:
l = 0
r = len(nums) - 1 # 左闭右闭
while(l <= r):
mid = l + (r-l) // 2 # 避免区间越界
if(target > nums[mid]):
l = mid + 1
elif(target < nums[mid]):
r = mid - 1
else:
return mid
return -1
java
class Solution {
public int search(int[] nums, int target) {
int l = 0;
int r = nums.length; // 左闭右开
while (l < r){
int mid = (l + r) / 2;
if(target > nums[mid]){
l = mid + 1;
}else if(target < nums[mid]){
r = mid;
}else {
return mid;
}
}
return -1;
}
}
参考
https://leetcode-cn.com/problems/binary-search
https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html#%E6%80%9D%E8%B7%AF
标签:二分,right,target,nums,--,mid,int,数据结构,左闭 来源: https://blog.csdn.net/weixin_45522528/article/details/123237476