当前位置:首页 > 力扣 > 力扣35:二分法在搜索插入位置中的运用

力扣35:二分法在搜索插入位置中的运用

4个月前 (05-20)

力扣35:二分法在搜索插入位置中的运用 二分查找 递归 算法 C++ 力扣 数组 第1张


有序数组的定位

在一个严格递增的数字序列中,每个元素都有其确定的位置。当新元素试加入时,我们需要回答两个问题:它是否已经存在?如果不存在,它应该插入在哪里?这道题要求我们在O(log n)时间内完成这个精确定位。


递归二分法的边界

递归处理逻辑:

‌1.双元素区间处理‌:当搜索范围缩小到2个元素时(l+1 == r-1),通过三重判断确定插入位置:位于中间、等于右边界或小于左边界

‌2.单元素区间终结‌:当区间只剩1个元素时(l == r-1),直接比较大小决定插入左侧还是右侧

‌3.动态区间调整‌:通过中点比较决定搜索方向,特别注意处理mid-1<0的边界情况,避免数组越界


代码及注释

class Solution {
public:
    // 递归核心:在半开区间[l,r)中定位target
    int binaryselect(vector<int> a, int num, int l, int r) {
        // 处理三元素区间特殊情况
        if (l + 1 == r-1) { // 实际处理2个有效元素
            if (a[l] < num && a[r-1] > num) 
                return l+1;  // 插入两元素之间
            else if(a[r-1] == num) 
                return r-1; // 命中右边界
            else if(a[l] >= num) 
                return l;   // 需插入左边界前
            return r;       // 插入右边界后
        }
        // 处理单元素区间
        else if(l == r-1) {
            return a[l] < num ? l+1 : l; // 决定插入左右
        }
        // 常规二分处理
        else {
            int mid = (l + r-1) / 2; // 中点计算
            if (a[mid] == num) 
                return mid; // 直接命中
            // 搜索右侧区间[mid+1,r)
            else if(a[mid] < num) 
                return binaryselect(a, num, mid + 1, r);
            // 搜索左侧区间[l,mid)
            else {
                if(mid-1 < 0) return l; // 左边界保护
                return binaryselect(a, num, l, mid);
            }
        }
    }

    int searchInsert(vector<int>& nums, int target) {
        // 启动递归,初始区间[0,n)
        return binaryselect(nums, target, 0, nums.size());
    }
};


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣933题:队列的妙用:如何高效统计最近请求

力扣933题:队列的妙用:如何高效统计最近请求

题目重解:我们需要设计一个能统计最近3000毫秒内请求次数的系统。每当新的请求到来时,它会带有时间戳t,我们需要返回过去3000毫秒内(包括当前)发生的请求总数。这就像是在时间轴上维护一个滑动窗口,只...

力扣第44题:寻找两个正序数组的中位数 - 合并排序解法详解

力扣第44题:寻找两个正序数组的中位数 - 合并排序解法详解

内容简介本文详细解析了力扣第44题"寻找两个正序数组的中位数"的合并排序解法。通过双指针技术合并两个有序数组,然后直接计算合并后数组的中位数。虽然时间复杂度为O(m+n),但这种方...

牛客14496题解:括号最大深度问题(栈思想与代码优化)

牛客14496题解:括号最大深度问题(栈思想与代码优化)

一、题目解读牛客14496题要求计算给定括号字符串中的最大深度。例如,对于字符串 "(()())",最大深度为2。题目考察对括号嵌套结构的理解,以及如何通过编程找到最深嵌套层次。二...

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

一、题目解读力扣3112题要求解决带时间限制的最短路径问题:给定一个有向图,节点具有消失时间,需计算从起点到各节点的最短路径,且路径总时间不能超过节点的消失时间。题目难点在于需在传统最短路径算法(如D...

2012年NOIP提高组「借教室」题目(P1083)解题思路与二分查找优化代码解析

2012年NOIP提高组「借教室」题目(P1083)解题思路与二分查找优化代码解析

一、题目解读本题为2012年NOIP提高组中的「借教室」问题(洛谷P1083),要求处理教室借用订单的分配问题。给定n天每天可用教室数量r和m个订单(订单包含需求教室数d、开始日期s、结束日期t),判...

洛谷1220题解:动态规划与区间DP优化解法(附代码注释)

洛谷1220题解:动态规划与区间DP优化解法(附代码注释)

一、题目解读洛谷1220题要求计算在n个位置放置灯的情况下,通过关闭连续区间灯并移动至区间端点,使得总耗电量最小。需考虑灯的功率与位置差异,设计高效的算法求解最优策略。二、解题思路1. 动态规划 +...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。