二分专题leetcode例题

本文深入探讨二分查找算法的基本思想和两种常见模板,通过讲解多个LeetCode例题,如求平方根、搜索插入位置、查找元素在排序数组的位置等,展示如何运用二分法解决实际问题,提升算法解题能力,适用于面试和算法学习。
摘要由CSDN通过智能技术生成

基本思想

首先确定答案在一个区间当中L到R。
通过中点判断答案在区间的某一边。
区间缩小,再次找中点。
70%的二分题目和单调性有关系
95%的题目 存在一种两段性的性质,左边成立,右边不成立。通过这个两段性的性质划分区间。

模板一

最后答案在右区间的左端点。
算mid下取整。

while(l<r){
   
	int mid = l+r>>1;
	if(check(mid))
		r=mid;
	else
		l=mid+1;
}
return l;

模板二

最后的答案在左区间的右端点。
算mid上取整(避免死循环)

while(l<r){
   
	int mid = l+r+1>>1;
	if(check(mid)
		l=mid;
	else
		r=mid-1;
}
return l;

流程

  1. 确定二分的边界l,r。定左右区间。
  2. 编写二分的代码框架。
  3. 设计一个check性质,性质要保证答案一定在性质的左右边界处且情况唯一。如果结果在左区间右端点用模板二,如果结果在右区间左端点用模板一
  4. 判断区间如何更新
  5. 如果更新方式写的是l=mid,r=mid-1,就在算mid的时候加一。

例 leetcode 69 X的平方根

按照二分流程分析

  1. 确定二分的边界,答案一定在0-x之间。
  2. 编写二分的代码框架
  3. check性质确定是。mid<=x/mid (防止溢出) 答案为左区间右端点,用模板二。
  4. 判断区间边界的情况,当条件满足时,mid包含在结果区间中。
  5. 更新情况是l=mid,r=mid-1。避免死循环,计算mid时要加一上取整。
    public int mySqrt(int x) {
   
        int l=0,r=x;
        while(l<r){
   
            int mid= (l+r+1)>>1;
            if(mid<=x/mid){
   
                l=mid;
            }else
                r=mid-1;
        }
        return l;
    }

例 leetcode 35 搜索插入位置

这里使用二分模板三

    public int searchInsert(int[] nums, int target) {
   
        int start=0;
        int end = nums.length-1;
        if(target<nums[0])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值