刷题笔记:二分查找

文章目录

模板1

模板代码:

int binarySearch(int[] nums, int target){
  if(nums == null || nums.length == 0)
    return -1;
    
  int left = 0, right = nums.length - 1;
  while(left <= right){
  	//防止int溢出
    int mid = left + ((right - left)>>1);
    if(nums[mid] == target)
    	return mid; 
    else if(nums[mid] < target) 
    	left = mid + 1;
    else 
    	 right = mid - 1; 
  }
  return -1;
}

模板特征:

  • 初始条件:left = 0, right = length-1
  • 终止条件:left > right
  • 向左查找:right = mid-1
  • 向右查找:left = mid+1

应用场景:
可以看到模板中当num[mid]==target相等时,函数终止,因此
一般用于查找数组中某个特定的元素是否存在及其下标。

例题:
leetCode 374

模板2

int binarySearch(int[] nums, int target){
  if(nums == null || nums.length == 0)
    return -1;

  int left = 0, right = nums.length;
  while(left < right){
  	//防止int溢出
    int mid = left + ((right - left)>>1);
    //确保最终一定在左侧
    if(nums[mid]<=target) left=mid;
    else 
    	right=mid-1;
  }
	return nums[left]==target?left:-1;
}

模板特征:

  • 初始条件:left = 0, right = length
  • 终止条件:left == right
  • 向左查找:right = mid-1
  • 向右查找:left = mid

应用场景:
可以看到模板中最后的那个元素满足条件的元素会出现最左端,因此一般用于查找数组中满足某一个条件的所有元素中最靠近左边的那个(如:寻找第一个大于target的数)

例题:
leetCode 278

模板3

int binarySearch(int[] nums, int target) {
    if (nums == null || nums.length == 0)
        return -1;

    int left = 0, right = nums.length - 1;
    while (left + 1 < right){//最后必然剩下两个元素
    	//防止int溢出
        int mid = left + ((right - left)>>1);
         if (nums[mid] < target) {
            left = mid;
        } else {
            right = mid;
        }
    }
    if(nums[left] == target) return left;
    if(nums[right] == target) return right;
    return -1;
}

模板特征:

  • 初始条件:left = 0, right = length-1
  • 终止条件:left + 1 == right
  • 向左查找:right = mid
  • 向右查找:left = mid

应用场景:
可以看到左右都有可能等于target,一般应用于找出数组中满足某一条件的所有数据。(如找出数组中所有等于target的元素)

例题:
leetCode 658

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值