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

【算法】二分

1. 找到有序区间中 =x 最左边的数字的位置

    static int getL(int a[], int l, int r, int x) {
        while (l < r) {
            int mid = l + r >> 1;
            if (x <= a[mid]) {
                r = mid;
            } else {
                l = mid + 1;
            }
        }
        if (a[l] != x) return -1;
        return l;
    }

2. 找到有序区间中 =x 最右边的数字的位置

    static int getR(int a[], int l, int r, int x) {
        while (l < r) {
            int mid = l + r + 1 >> 1;
            if (x < a[mid]) {
                r = mid - 1;
            } else {
                l = mid;
            }
        }
        if(a[l] != x) return -1;
        return l;
    }

r = mid - 1;int mid = l + r + 1 >> 1;的操作是绑定的

3. 找到有序区间中 >=x 第一个数字的位置

    static int lowerBound(int a[], int l, int r, int x) {
        if (x > a[r]) return -1;
        while (l < r) {
            int mid = l + r >> 1;
            if (x <= a[mid]) {
                r = mid;
            } else {
                l = mid + 1;
            }
        }
        return l;
    }

4. 找到有序区间中 >x 第一个数字的位置

    static int upperBound(int a[], int l, int r, int x) {
        if (x >= a[r]) return -1;
        while (l < r) {
            int mid = l + r >> 1;
            if (x < a[mid]) {
                r = mid;
            } else {
                l = mid + 1;
            }
        }
        return l;
    }

5. 总结

  1. 循环条件都是 l < r
  2. getLlower_bound是一样的,除了最后的判断 l 是不是目标值
  3. getRupper_bound的区别在于left = mid+1 还是让right=mid-1
    1. 如果是获取= x 的最右边的位置,那么当 x<a[mid] 的时候,说明目标位置还在左边的区间,right=mid-1
    2. 如果是获取>x 的最左边的位置,那么当 x<a[mid] 的时候,说明 mid 的大小不够,需要向右移动,此时 mid 位置的值不需要考虑,left = mid+1
  1. “最左”判定条件都是 <=

http://www.kler.cn/a/397675.html

相关文章:

  • Python作业05
  • 【第三课】Rust变量与数据类型(二)
  • Ubuntu 24.04 安装 JDK 21
  • MySQL【七】
  • 动态内存管理(c语言)
  • Scala的Array
  • PMP--一、二、三模、冲刺--分类--变更--技巧--特点
  • Linux debian系统安装ClamTk开源图形用户界面(GUI)杀毒软件
  • Kubernetes 魔法棒:kubeadm 一键部署的奇妙之旅
  • AI技术在电商中的挑战与未来
  • web——upload-labs——第一关
  • Eclipse 安装插件
  • 如何在pytorch中建立叶子节点.
  • 中仕公考怎么样?公务员考试考什么?
  • MySQL技巧之跨服务器数据查询:基础篇-A数据库与B数据库查询合并
  • Onlyoffice配置一 JWT認證
  • 【Linux】进程的优先级
  • 低代码平台:跨数据库处理的重要性与实现方式
  • MSTP实验
  • Codeforces Round 987 (Div. 2) ABCD
  • Qt Event事件系统小探2
  • Python从0到100(七十二):Python OpenCV-OpenCV实现手势音量控制(文末送书)
  • JWT 过期后 自动刷新方案
  • git/dvc笔记
  • ElasticSearch学习笔记一:简单使用
  • 项目启动运行npm run dev报错digital envelope routines::unsupported at new Hash