当前位置: 首页 > news >正文

算法模板(二分法开区间模板,二分法闭区间模板)

二分法闭区间模板:

class Solution {

    // lower_bound 返回最小的满足 nums[i] >= target 的 i

    // 如果数组为空,或者所有数都 < target,则返回 nums.size()

    // 要求 nums 是非递减的,即 nums[i] <= nums[i + 1]


    // 闭区间写法

    int lower_bound(vector<int>& nums, int target) {

        int left = 0, right = (int) nums.size() - 1; // 闭区间 [left, right]

        while (left <= right) { // 区间不为空

            // 循环不变量:

            // nums[left-1] < target

            // nums[right+1] >= target

            int mid = left + (right - left) / 2;

            if (nums[mid] < target) {

                left = mid + 1; // 范围缩小到 [mid+1, right]

            } else {

                right = mid - 1; // 范围缩小到 [left, mid-1]

            }
        }
        return left;
    }

二分法开区间模板:

// 开区间写法

    int lower_bound3(vector<int>& nums, int target) {

        int left = -1, right = nums.size(); // 开区间 (left, right)

        while (left + 1 < right) { // 区间不为空

            // 循环不变量:

            // nums[left] < target

            // nums[right] >= target

            int mid = left + (right - left) / 2;

            if (nums[mid] < target) {

                left = mid; // 范围缩小到 (mid, right)

            } else {

                right = mid; // 范围缩小到 (left, mid)

            }

        }

        return right;

    }

二分法左闭右开区间写法:

// 左闭右开区间写法

    int lower_bound2(vector<int>& nums, int target) {

        int left = 0, right = nums.size(); // 左闭右开区间 [left, right)

        while (left < right) { // 区间不为空

            // 循环不变量:

            // nums[left-1] < target

            // nums[right] >= target

            int mid = left + (right - left) / 2;

            if (nums[mid] < target) {

                left = mid + 1; // 范围缩小到 [mid+1, right)

            } else {

                right = mid; // 范围缩小到 [left, mid)

            }

        }

        return left;

    }

视频链接:二分查找为什么总是写错?_哔哩哔哩_bilibili

来源:35. 搜索插入位置 - 力扣(LeetCode)

http://www.dtcms.com/a/30456.html

相关文章:

  • 【华三】STP的角色选举(一文讲透)
  • 市场趋势中突破确认的多维度判断方法
  • 【简历优化】性能调优 — 编程性能调优篇
  • Linux远程kill进程及$处理
  • java练习(36)
  • 如何在 React 中测试高阶组件?
  • python: SQLAlchemy (ORM) Simple example using mysql in Ubuntu 24.04
  • Docker挂载数据显式挂载和隐式挂载的区别
  • DeepSeek掘金——VSCode 接入DeepSeek V3大模型,附使用说明
  • ubuntu ffmpeg 安装踩坑
  • Liunx(CentOS-6-x86_64)系统安装MySql(5.6.50)
  • 基于灾害链动仿真分析路径
  • 为AI聊天工具添加一个知识系统 之115 详细设计之56 知识表征 之2
  • Linux修改主机名称
  • c#编程:学习Linq,重几个简单示例开始
  • logging-operator 部署fluentd-bit日志报kubernetes链接错误
  • 【弹性计算】虚拟化技术
  • 报错:Cannot read properties of null (reading ‘ce‘)解决方法
  • C 端产品-用户的分群图纸 - AxureMost
  • 机器学习实战(12):项目实战—端到端的机器学习项目Kaggle糖尿病预测
  • 除了 EasyXLS,加载和显示.xlsx 格式的excel表格,并支持单元格背景色、边框线颜色和粗细等格式化特性
  • FBX与STEP格式解析及FBX转STEP在线转换指南
  • 记录一下_treafik使用Gateway-APi使用的细节参数
  • MySQL数据库——表的约束
  • 数据库驱动免费下载(Oracle、Mysql、达梦、Postgresql)
  • 【DeepSeek】-macOS本地终端部署后运行DeepSeek如何分析图片
  • Ollama Docker 镜像部署
  • IEEE官方期刊缩写查询pdf分享
  • Spring MVC的基本概念
  • 【编程语言】委托与函数指针