二分搜索-C

有序数组寻找不大于目标的最大值索引(左边界)

c 复制代码
// 升序
int cmp(int a, int b) {
	return a-b;
}
long searchLeft(long left, long right, int target) {
	// 1.判断[left,right)区间内是否有左边界
	if(cmp(left,target) < 0) return -1;
	// 左闭右开,有效区域[left,right)
    while(left < right) {
        long mid = left + (right -left)/2;
        // mid对应值不比目标值小,说明左边界在左侧,截断右边区域,right=mid,有效区域由[left,right)变为[left,mid)
        if(cmp(mid, target) >= 0) {
            right = mid;
        }
        // mid对应值比目标值小,说明左边界在右侧,截断左边区域,left = mid+1,有效区域由[left,right)变为[mid+1,right)
        else {
            left = mid+1;
        }
    }
    // 2.如果[left,right)区间内有左边界,在区间收敛的最后一步总是由[x,x+1)变为[x,x)或[x+1,x+1),即left==right
    return right;
}

有序数组寻找不小于目标的最小值索引(右边界)

c 复制代码
// 升序
int cmp(int a, int b) {
	return a-b;
}
long searchRight(long left, long right, int target) {
	// 1.判断[left,right)区间内是否有右边界
	if(cmp(right-1,target) > 0) return -1;
	// 左闭右开
    while(left < right) {
        long mid = left + (right -left)/2;
        // mid对应值比目标值小,说明右边界在右侧,截断左边区域,有效区域由[left,right)变为[mid+1,right)
        if(cmp(mid, target) < 0) {
            left = mid+1;
        }
        // mid对应值比目标值大,说明右边界在左侧,截断右边区域,right=mid,有效区域由[left,right)变为[left,mid)
        else if(cmp(mid, target) > 0){
            right = mid;
        }
        // mid对应值与目标值相等1.说明右边界在右侧,截断左边区域,但mid本身可能是右边界,有效区域由[left,right)变为[mid,right) 2. 在区间为[x,x+1)时,且进入此判断,下次还会进,这里增加二次进入判断。
        else {
            if(left == mid) break;
            left = mid;
        }
    }
    // 2.[left,right)区间内有右边界,在区间收敛的最后一步总是由[x,x+1)变为[x,x+1)或[x+1,x+1),left值为最终结果
    return left;
}
相关推荐
Dlrb12113 小时前
C语言-指针三
c语言·算法·指针·const·命令行参数
kkeeper~3 小时前
0基础C语言积跬步之深入理解指针(5下)
c语言·开发语言
Tisfy3 小时前
LeetCode 2540.最小公共值:双指针(O(m+n))
算法·leetcode·题解·双指针
IronMurphy3 小时前
【算法四十七】152. 乘积最大子数组
算法
淘矿人4 小时前
Claude辅助DevOps实践
java·大数据·运维·人工智能·算法·bug·devops
Cosolar4 小时前
万字详解:RAG 向量索引算法与向量数据库架构及实战
数据库·人工智能·算法·数据库架构·milvus
三品吉他手会点灯5 小时前
C语言学习笔记 - 40.数据类型 - scanf函数的编程规范与非法输入处理
c语言·开发语言·笔记·学习
落羽的落羽6 小时前
【算法札记】练习 | Week4
linux·服务器·数据结构·c++·人工智能·算法·动态规划
萑澈6 小时前
算法竞赛入门:C++ STL核心用法与时空复杂度速查手册
数据结构·c++·算法·stl