二分法----一看就会,一写就废

本文介绍了二分查找的概念、适用情况和常见细节,强调了其在有序数组或局部有序数组中的应用。通过具体例子解释了如何处理二分查找中的边界条件和重复元素,展示了如何利用二分法解决LeetCode等实际问题。
摘要由CSDN通过智能技术生成


一、二分法是什么?

二分法通常又叫二分查找,一般用于查找一个有序数组中的某个值的位置或者给定的特定值的插入位置;
相比把整个数组遍历一次的O(n)复杂度,二分查找可以把复杂度降低到O(logn);
二分查找的基础概念在这里就不再赘述,本文主要记录二分法的基本情况使用和采用二分思路来求解的一些问题。

二、二分法在什么情况下使用

二分法一定是建立在元素有序的前提下的(或数据具有二段性);所以看到题目中出现有序数组等词时,并且要求我们查找某个值或者给一个值求插入位置,或者判断其中是否存在某个值或者利用二分思路求最大最小值等;这些都可以使用二分法

二分法需要注意的细节
二分法的思路很简单,无非就是每次根据中值判断,然后缩减区间到原来的一半;二分法最容易出错的地方在于边界和细节处理,大体逻辑并不难写出,我们往往死在细节处理上。

二分法的边界模板分为两种;
一种是左闭右闭的区间写法[left,right]: while(left<=right) left的改变为left=mid+1,right的改变为right=mid-1;
一种是左闭右开的区间写法[left,right) : while(left<right) left的改变为left=mid+1,right的改变为right=mid;
在二分查找的过程中,保持不变量;这也就是循环不变量。

下面来看具体的应用

三、实际应用

在这里插入图片描述
写法一:区间左闭右闭【left,right】

class Solution {
   
    public int searchInsert(int[] nums, int target) {
   
    	int len=nums.length;
    	int left=0,right=len-1;
    	while(left<=right) {
   
    		int mid=(left+right)/2;
    		if(nums[mid]<target) {
   
    			left=mid+1;
    		}
    		else {
   
    			right=mid-1;
    		}
    	}
    	return left;
    }
}

写法二:区间左闭右开【left,right)

class Solution {
   
    public int searchInsert(int[] nums, int target) {
   
    	int len=nums.length;
    	int left=0,right=len;
  • 19
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值