文章目录
一、二分法是什么?
二分法通常又叫二分查找,一般用于查找一个有序数组中的某个值的位置或者给定的特定值的插入位置;
相比把整个数组遍历一次的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;