日野弥生:勉強しよう

binary search

发表于2024年12月12日

#二分查找 #二分搜索 #有序数组

介绍

二分查找(英语:binary search),也称折半搜索(英语:half-interval search)、对数搜索(英语:logarithmic search),是用来在一个有序数组中查找某一元素的算法。

过程

以在一个升序数组中查找一个数为例。

它每次考察数组当前部分的中间元素,如果中间元素刚好是要找的,就结束搜索过程;如果中间元素小于所查找的值,那么左侧的只会更小,不会有所查找的元素,只需到右侧查找;如果中间元素大于所查找的值同理,只需到左侧查找。

实现

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int end = nums.size()-1,start=0;

        while(start <=end)
        {
        int mid = start + ((end - start) >> 1);
        if(target<nums[mid])
            end =mid-1;
        else if(target>nums[mid])
            start = mid+1;
        else 
            return mid;
        }
        return start;
    }
};

边界条件

A、 while(start <=end);

start <= end:这个条件确保了当 start 和 end 相等时,也能够继续执行循环体,进行最后的比较。即使 start 和 end 指向同一个位置,循环依然会进行一次中间值的计算,并判断 nums[mid] 是否等于目标值 target。

start < end:如果使用这个条件,最后当 start == end 时,循环会停止。此时,mid 已经没有机会与 target 比较。因此,可能会错过需要处理的最后一个元素。

B、 start = mid+1; end =mid-1;

迭代条件维持时,循环变体需要避免掉重复的部分。

C、 return start;
当目标值 target 不在数组中时,start 会指向目标值应该插入的位置。

分类讨论: 1、最后的区间为$[n,n+1]$时,start和mid指向n,end指向n+1; 如果target==n时,结果为n,即start或者end; 如果target < n时,结果为n,即start或者end; 如果target > n时,(此时应该移位),结果为n+1, 即start或者end+1;

2、最后的区间为$[n]$时,start、mid和end都指向n; 如果target==n时,结果为n,即start或者end; 如果target < n时,结果为n,即start或者end; 如果target > n时,(此时应该移位),结果为n+1, 即start或者end+1;

综上,return start。

算法思想:https://oi-wiki.org/basic/binary/

上一篇

prefix sum

下一篇

KMP