AcWing 789. 数的范围

题意:
  • 给定一个升序数组
  • 输入一个数
  • 输出这个数第一次出现的下标和最后一次出现的下标
  • 如果这个数不存在则输出-1 -1
思路:
  • 用两次二分
  • 第一次用来找到key出现的第一个位置 (区间二段性的分界点:左边 < 分界点,右边 >= 分界点)
  • 第二次用来找到key出现的最后一个位置 (区间二段性的分界点:左边 <= 分界点,右边 > 分界点)
public class Main {Scanner s = new Scanner(System.in);int n, q;int[] arr;int num;void run() {n = s.nextInt();q = s.nextInt();arr = new int[n];for (int i = 0; i < n; i++) {arr[i] = s.nextInt();}while (q-- > 0) {num = s.nextInt();range(arr, num);}}void range(int[] arr, int num) {// 先从数组找到第一个num的下标int l1 = 0, r1 = arr.length - 1;while (l1 < r1) {int mid = (l1 + r1) / 2;// arr[mid]符合左半段性质if (arr[mid] < num) {l1 = mid + 1;} else {r1 = mid;}}// 从数组中找到最后一个num的下标int l2 = 0, r2 = arr.length - 1;while (l2 < r2) {int mid = (l2 + r2) / 2 + 1;// arr[mid]符合右半段性质if (arr[mid] > num) {r2 = mid - 1;} else {l2 = mid;}}System.out.println(arr[l1] == num ?  l1 + " " + l2 : "-1 -1");}public static void main(String[] args) {new Main().run();}
}
收获
  1. 避免二分法死循环的方式

    // mid 向下取整时,l要相对mid移动,l == r时终止循环,此时l处即为key第一次出现的位置
    int l = 0;
    int r = arr.length - 1;
    while (l < r) {int mid = l + (r - l) / 2;if (key > arr[mid]) {l = mid + 1;} else {r = mid;}
    }
    
    // mid 向上取整时,r要相对mid移动,l == r时终止循环,此时r处即为key第一次出现的位置
    int l = 0;
    int r = arr.length - 1;
    while (l < r) {// 向上取整int mid = l + (r - l) / 2 + 1;if (key < arr[mid]) {r = mid - 1;} else {l = mid;}
    }
    

AcWing 789. 数的范围 (整数二分)相关推荐

  1. AcWing 789. 数的范围

    题目链接 https://www.acwing.com/problem/content/791/ 思路 写一个划分x为左边界和有边界的整数二分方法即可 #include<bits/stdc++. ...

  2. 模版 ----- 整数二分

    整数二分思想 确定一个区间,使得目标值一定在这个区间内 从题目中找到一种性质: 该性质具有二段性,比如一个数组的前半段元素符合该性质,后半段元素就不符合该性质了 目标值一定为二段性的分界点处 即:目标 ...

  3. 二分算法详解:整数二分及浮点数二分算法(Binary Search)(含算法模板)

    一.二分算法简介 当我们要从一个序列中查找一个元素的时候,最简单无脑的方法就是顺序查找法,但由于在大数据情况下爆炸的时间复杂度而舍弃. 最常见的方法是二分查找,也称折半查找(Binary Search ...

  4. (ACWing yxc讲解基础算法课程笔记)基础算法 整数二分

    二分排序: 整数二分: 我们先来说一下单调性和二分的区别,有单调性一定能进行二分排序,但是能进行二分排序的不一定有单调性.所以说二分的本质并非是单调性. 我们假设有这样一个范围.我们能把它分成两个部分 ...

  5. 整数二分详解---yxc

    //整数二分的模板 1.while(l<r) { int mid=l+r+1>>2; if(check(mid)) l=mid; else r=mid-1; } 2.while(l& ...

  6. 整数二分查找原理及代码模板

    1.整数二分算法原理 ps:数组具有单调性,则一定可以使用整数二分算法:但是,能够使用整数二分算法的数组,数组未必具有单调性. 整数二分算法的本质:给定一个区间,在区间中定义了某种性质.该性质在区间的 ...

  7. leetcode 两数之和 整数反转 回文数 罗马数字转整数

    1.两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个 ...

  8. 【AcWing 243. 一个简单的整数问题2】

    例题:[AcWing 243. 一个简单的整数问题2] 线段树模板题,区间修改区间求和. 题解: 将序列分成N/B块,维护: id[i] = i/B,i所在块标号 res[id] = 第id块的sum ...

  9. 不大于数的2整数幂的数

    获得不大于数的2整数幂的数.例如, 不大于6的2整数幂的数是4. 1 #include <bitset> 2 3 using namespace std; 4 5 /* 6 * 返回不大于 ...

最新文章

  1. 必须要懂得的密码技术
  2. 云视频会议的“多、快、好、省”(下)
  3. [Flex] 组件Tree系列 —— 阻止用户点击选中Tree中分支节点
  4. Windows 10 系统安装教程
  5. 深入理解最大池化为什么能够实现不变性?
  6. python templates_python templates在哪
  7. MySQL sql99语法—等值连接
  8. 基于Xml 的IOC 容器-载入<property>的子元素
  9. MCU,RTOS,物联网之间的关系。
  10. 视觉测试_视觉设计流行测验
  11. 数据挖掘——数据仓库
  12. eclipse中java.lang.OutOfMemoryError: Java heap space错误
  13. android textview密文,TextView 明密文处理
  14. 顺丰业绩突然爆雷:预计巨亏9-11亿!京东、美团等10家平台承诺不用大数据杀熟;苹果推迟MacBook和iPad生产|极客头条...
  15. mysql配置文件my.cnf的事例并附解释
  16. ubuntu mysql主从备份_Ubuntu 16 MySQL主从备份配置
  17. Qt总结之二十:加载字体库
  18. Linux Qt入门:工程构建笔记一
  19. Java如何提高poi的user模式解析excel大小上限
  20. 程序设计基本结构———顺序、选择与循环

热门文章

  1. 旅游规划(双权连通图)
  2. 数据库优化之mysql【转】
  3. 从前端到后端的跨域攻击与防御
  4. Python代码之三级登录
  5. PHP的线程安全与非线程(NTS)安全版本的区别
  6. [Java_kaikeba]java中堆和栈的区别(对象变量的理解)
  7. Android下将图片载入到内存中
  8. 简明Linux命令行笔记:tee
  9. 《大型数据库技术》MySQL的进阶开发技巧
  10. 【Spring 工厂】注入详解 — Set注入(JDK内置类型,用户自定义类型)、构造注入(重载)