万物的算法日记|算法学习 [java 二分法 acwing789.数的范围]

news2024/11/28 6:47:40

请添加图片描述

算法语言:java
题目来源:acwing.789

文章目录

  • 题目描述
  • 题解
    • 五点七边的二分法
      • 第一个细节 l,r 边界问题
      • 为什么 l 边界初始化为 -1?
      • 同理为什么 r 边界初始化为 N而不是N-1 ?
      • 第二个细节 m是否始终处于[0,N)以内
      • 第三个细节,更新指针时,能不能写成l = m+1,r = m-1
      • 第四个细节 代码会不会陷入死循环
      • 流程
        • 1. 确定分界线
        • 2.建模,划分红蓝区域,确定IsBlue()
        • 3. 确定返回l 还是 r
        • 4. 套用算法模版
  • 代码

题目描述

给定一个按照升序排列的长度为 的整数数组,以及 q 个查询。

对于每个查询,返回一个元素 kk 的起始位置和终止位置(位置从 0 开始计数)。

如果数组中不存在该元素,则返回 -1 -1。

输入格式

第一行包含整数 n 和 q,表示数组长度和询问个数。

第二行包含 n 个整数(均在 1∼100001∼10000 范围内),表示完整数组。

接下来 q 行,每行包含一个整数 kk,表示一个询问元素。

输出格式

共 q 行,每行包含两个整数,表示所求元素的起始位置和终止位置。

如果数组中不存在该元素,则返回 -1 -1。

数据范围

1≤n≤1000001≤n≤100000
1≤q≤100001≤q≤10000
1≤k≤100001≤k≤10000

输入样例:

6 3
1 2 2 3 3 4
3
4
5

输出样例:

3 4
5 5
-1 -1

题解

五点七边的二分法

五点七边 二分法 红蓝区域边界法

l = -1,r = N
while(l+1 != r)
	m=(l+r)/2
	if IsBlue(m)
		l = m;
	else
		r = m
return l or r

第一个细节 l,r 边界问题

为什么 l 边界初始化为 -1?

如果数组从开始就是红色边界,那么就如果 l 边界初始化为0的话,那么就会错误,不会出现蓝色区域

同理为什么 r 边界初始化为 N而不是N-1 ?

整个数组如果从刚开始就是蓝色区域,那么 r边界定义为N-1 会处于蓝色区域内,就会出现错误,不会出现红色区域

第二个细节 m是否始终处于[0,N)以内

在这里插入图片描述

第三个细节,更新指针时,能不能写成l = m+1,r = m-1

在这里插入图片描述

第四个细节 代码会不会陷入死循环

在这里插入图片描述

流程

1. 确定分界线

2.建模,划分红蓝区域,确定IsBlue()

3. 确定返回l 还是 r

4. 套用算法模版

代码

import java.util.Scanner;

public class day0705_0 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int q = sc.nextInt();
        int arr[] = new int[n];
        for(int i=0;i<n;i++){
            arr[i] = sc.nextInt();
        }
        for(int j =0;j<q;j++){
            int temp = sc.nextInt();
            int res1 = binary_search1(arr,n,temp);
            int res2 = binary_search2(arr,n,temp);
            System.out.println(res1+" "+res2);
        }
    }
    public static boolean isBlue1(int num,int x){
        if(num < x ) return true;
        else return false;
    }
    public static int binary_search1(int [] arr,int len,int x){
        int l = -1,r = len;
        while(l+1<r){
            int mid = (l+r)>>1;
            if(isBlue1(arr[mid],x)){
                l = mid;
            }else{
                r = mid;
            }
        }
        if(r == len){
            return -1;
        }
        if(arr[r] == x) return r;
        else return -1;
    }
    public static int binary_search2(int []arr,int len,int x){
        int l =-1,r = len;
        while(l+1 <r){
            int mid = (l+r) >>1;
            if(isBlue2(arr[mid],x)){
                l = mid;
            }else{
                r = mid;
            }
        }
        if(l == -1){
            return -1;
        }
        if(arr[l] == x) return l;
        else return -1;
    }
    public static boolean isBlue2(int num,int x){
        if(num<=x) return true;
        else return false;
    }
}

优化后:

import java.util.Scanner;
public class day0705_0 {
    static int N = 100010;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int q = sc.nextInt();
        int arr[] = new int[N];
        for(int i=0;i<n;i++){
            arr[i] = sc.nextInt();
        }
        for(int j =0;j<q;j++){
            int temp = sc.nextInt();
            int res1 = binary_search1(arr,n,temp);
            if(res1 == -1){
                System.out.println(-1+" "+-1);
                continue;
            }
            int res2 = binary_search2(arr,n,temp);
            System.out.println(res1+" "+res2);
        }
    }
    public static int binary_search1(int [] arr,int len,int x){
        int l = -1,r = len;
        while(l+1<r){
            int mid = (l+r)>>1;
            if(arr[mid] <x){
                l = mid;
            }else{
                r = mid;
            }
        }
        if(r == len){
            return -1;
        }
        if(arr[r] == x) return r;
        else return -1;
    }
    public static int binary_search2(int []arr,int len,int x){
        int l =-1,r = len;
        while(l+1 <r){
            int mid = (l+r) >>1;
            if(arr[mid] <=x){
                l = mid;
            }else{
                r = mid;
            }
        }
        if(l == -1){
            return -1;
        }
        if(arr[l] == x) return l;
        else return -1;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/719894.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【UnityDOTS 四】System的理解

System的理解 前言 System主要用于在ECS中进行逻辑处理。它具有自己的声明周期&#xff0c;主要分为两类&#xff1a;ISystem,SystemBase。前一个是非托管内存访问&#xff0c;后一个是托管内存访问。 一、Systemg认知 System在主线程运行&#xff0c;可以在代码中使用Job系…

基于php电影动漫在线观看系统 (源码➕数据库)

本系统主要是为用户提供一个动漫视频观看的平台&#xff0c;系统分为两个角色&#xff0c;一个是用户角色&#xff0c;另一个是管理员角色&#xff0c;其中用户角色可查看动漫视频的分类&#xff0c;查看动漫视频的详情&#xff0c;点击播放动漫视频&#xff0c;对动漫视频进行…

如何使用 OpenCV 去除图像背景

文末附源代码的免费下载链接 在本教程中,我们将学习如何使用 OpenCV 使用一种名为背景减法的技术来去除视频中的背景。 背景扣除是计算机视觉中用于检测视频中移动物体的常用技术。对于安全、监视、交通监控等来说,这是一种非常有用的技术。 背景减法的基本思想是通过从前景…

VirtualBox安装Ubuntu(22.04.2)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

【Hello mysql】 数据库基础

Mysql专栏&#xff1a;Mysql 本篇博客简介&#xff1a;简单的介绍mysql相关的一些基础知识和在Linux环境下的安装 让大家对于mysql有一个初步的认知 数据库基础 数据库基础数据库定义数据库再理解软件角度文件角度总结 主流数据库mysql安装卸载不要的环境获取mysql官方yum源安装…

MySQL数据库引擎及账号管理

目录 前言 二、MySQL数据库引擎 1.是什么 2.MySQL的核心 3.MySQL的存储引擎 a.InnoDB(MySQL默认引擎) b.ACID事务 c.四种隔离级别 d.MyISAM e.MEMORY&#xff08;Heap&#xff09; 4.存储引擎查看 三、命令行操作数据库 四、账号管理 前言 MySQL安装请看MySQL的安装…

输入框input事件compositionstart和compositionend的妙用

现象&#xff1a; 在将输入输入法切换到中文的时候&#xff0c;在打拼音的过程中也会触发oninput事件&#xff0c;如下&#xff1a; const Demo()>{const [value,setValue]useState("");return (<><input onInput{(e)>{console.log("value&…

【多种优化算法比较】混沌引力搜索算法(CGSA)(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

byte字节值与ASCII表中char之间的转换

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

三款小游戏功能:让孩子在运动中享受智力挑战

最近看到一款很有趣的小玩具&#xff0c;是一种专门为儿童设计的益智训练器&#xff0c;功能很丰富&#xff0c;可以为孩子带来不少乐趣&#xff0c;起到一些体能和智力训练的作用。这款叫做益智感统摸高训练器的小工具&#xff0c;主要功能就是帮助儿童进行摸高训练&#xff0…

C/C++内存管理详解

去年的今日&#xff0c;博主第一次发文&#xff0c;那时初出茅庐&#xff0c;没什么经验。时隔一年&#xff0c;更加优质的博文献上&#xff0c;希望可以帮助到更多的人❤️❤️❤️ 文章目录 &#x1f4ac; 前言一、C/C内存分布二、C语言中动态内存管理方式三、C内存管理方式1…

AlexNet实战

前言&#xff1a;之前学了挺多卷积神经网络模型&#xff0c;但是都只停留在概念。代码都没自己敲过&#xff0c;肯定不行&#xff0c;而且这代码也很难很多都看不懂。所以想着先从最先较简单的AlexNet开始敲。不过还是好多没搞明白&#xff0c;之后逐一搞清楚。 文章目录 Alex…

Spark弹性分布式数据集

1. Spark RDD是什么 RDD&#xff08;Resilient Distributed Dataset&#xff0c;弹性分布式数据集&#xff09;是一个不可变的分布式对象集合&#xff0c;是Spark中最基本的数据抽象。在代码中RDD是一个抽象类&#xff0c;代表一个弹性的、不可变、可分区、里面的元素可并行计…

BottomNavigationView(自带角标)无法添加角标的解决问题

android studio的报错提示&#xff1a;java.lang.IllegalArgumentException: The style on this component requires your app theme to be Theme.MaterialComponents (or a descendant). 解决&#xff0c;改主题&#xff1a;

跨境平台做测评、采退、Lu卡、lu货要怎么做安全?

大家好&#xff0c;我是珑哥测评&#xff0c;今天和大家聊聊比较小众的圈子&#xff0c;也就是测评衍生出来的分支&#xff0c;采购和退款。因为最近也有很多客户咨询这个问题&#xff0c;由于沃尔玛风控升级了&#xff0c;很多客户下不成功的问题。 大家都知道无论是做测评还是…

BPM流程引擎适用于哪些类型企业管理系统

看到标题的童鞋们&#xff0c;估计在搜索办公软件系统时都会留意到BPM&#xff0c;那BPM到底是何方神圣&#xff1f;它与管理系统有什么区别呢&#xff1f;今天我们一一解答。 什么是BPM&#xff1f; BPM&#xff08;即业务流程管理&#xff09;&#xff0c;是企业信息化发展的…

[网络] ifconfig down掉的网口,插上网线网口灯依然亮?

1、软硬件环境 环境1&#xff1a; 硬件&#xff1a; 飞腾E2000Q ARM64 平台 YT8521SH (phy) 软件&#xff1a; linux 4.19.246 环境2&#xff1a; 硬件&#xff1a; NXP T1042 PowerPC 平台 YT8521SH (phy) 软件&#xff1a; linux 4.1.35 备注&#xff1a; 1、环境1的网…

Rdkit|分子可视化

Rdkit|分子可视化 Github&#xff1a; 地址 单个展示 从mol对象到图片&#xff1a;MolToImage(mol, size, kekulize, wedgeBonds, fitImage, …) mol&#xff1a;mol对象 size&#xff1a;图片尺寸&#xff0c;默认(300, 300) kekulize&#xff1a;是否展示kekule形式&#…

Apikit 自学日记:新建 API 请求

进入流程测试用例详情页&#xff0c;点击添加测试步骤&#xff0c;在下拉菜单中选择 添加API请求 &#xff0c;系统会自动进入API测试步骤编辑页面&#xff0c;接下来你可以编辑API的请求参数、返回结果、校验规则等内容。 设置 API 测试步骤 API测试步骤设置分为以下几个部分…

react笔记_07类组件

目录 复习展开运算符 组件什么叫做组件&#xff1f;分类类组件es6新增构造函数语法类组件渲染类组件的this指向类组件的三大属性state作用语法-初始化数据语法-修改state数据语法-获取state中的数据案例 propspropTypes属性(prop-types库)defaultProps属性 refs[1] 字符串形式的…