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

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

1周前 (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());
    }
};


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣198.打家劫舍|动态规划解法中的特殊边界处理

力扣198.打家劫舍|动态规划解法中的特殊边界处理

题意解析:在排列成直线的房屋群中,每个房屋藏有价值不同的财物。小偷不能连续抢劫相邻的两间房屋,否则会触发警报。我们需要设计一套抢劫策略,使得在不触发警报的前提下,能够获取的最大财物总和。这个问题本质上...

用栈结构优雅破解括号匹配难题(力扣20题)

用栈结构优雅破解括号匹配难题(力扣20题)

一、题目重新解读给定一个仅包含 ('、')、'['、']'、'{'、'}' 的字符串,判断其是否有效。有效需满足:1....

力扣746:三步通关最小花费爬楼梯

力扣746:三步通关最小花费爬楼梯

题目解析:站在楼梯的某个台阶时,需要支付当前台阶对应的体力值cost[i],之后可以选择向上爬1或2个台阶。最终目标是到达‌楼层顶部‌(即数组末尾之后的位置),且初始位置可选择下标0或1的台阶作为起点...

力扣第92题:三步定位 精准反转链表指定区间

力扣第92题:三步定位 精准反转链表指定区间

题目解读给定一个单链表和两个整数left与right,要求将链表中从第left个节点到第right个节点的部分进行反转,而保持其他部分不变。例如,对于链表1→2→3→4→5,left=2,right=...

力扣5:中心扩散法 轻松破解最长回文子串

力扣5:中心扩散法 轻松破解最长回文子串

题目解读:在一个给定的字符串中,我们需要找到最长的回文子串。回文是指正读反读都相同的字符串,如"aba"、"abba"都是回文。这个问题看似简单,但要在字符串中...

力扣第654题:最大二叉树解题教程 用数组构造最大二叉树

力扣第654题:最大二叉树解题教程 用数组构造最大二叉树

题目解读给定一个不含重复元素的整数数组,我们需要构建一棵最大二叉树。构建规则是:数组中的最大值作为根节点,其左侧子数组构建左子树,右侧子数组构建右子树,然后递归地应用这个规则。这种构建方式体现了分治思...

发表评论

访客

看不清,换一张

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