二分算法的变种----查找递增可重复数组边界

news2024/9/25 17:19:09

public class test {
    //数组长度a,b,c为8,d为7;
    static int[] a = {3,5,8,8,8,9,9,10};
    static int[] b = {8,8,8,8,8,8,8,8};
    static int[] c = {0,0,0,0,0,0,0,0};
    static int[] d = {0,0,0,0,0,0,0};
    public static void main(String[] args) {
        int target = 0;
        System.out.println("左边索引为:" + foundleft(target,d));
        System.out.println("右边索引为:" + foundright(target,d));
    }

    //要求时间复杂度为:log2n  --->  使用二分查找;
    //基本想法:不管是否找到 target值,都移动左右索引,直到左右索引重合;最后输出条件:索引重合&&索引处的数据为target;

    private static int foundleft(int target,int[] arr) {
        int left = 0,right = arr.length - 1;
        while (left != right){
            int mid = (left + right) / 2;
            if (target <= arr[mid]){
                right = mid;
            } else{
                left = mid;
            }
            if (right - left == 1 && arr[left] == target)
                return left;
            if(right - left == 1 && arr[right] == target)
                return right;
            if (right - left == 1)
                return -1;
        }
        return left;
    }

    private static int foundright(int target,int[] arr) {
        int left = 0,right = arr.length - 1;
        while (left != right){
            int mid = (left + right) / 2;
            if (target < arr[mid]){
                right = mid;
            } else{
                left = mid;
            }
            if(right - left == 1 && arr[right] == target)
                return right;
            if (right - left == 1 && arr[left] == target)
                return left;
            if (right - left == 1)
                return -1;
        }
        return right;
    }
}

上面的注释中说到基本想法:等到索引重合无法实现,不论是奇数个还是偶数个查找,最终都会以左右索引差1结束。因为当right - left==1时,mid与right或left永远相等。

可以进一步优化代码和效率:(主要是方法那部分)

private static int foundleft(int target,int[] arr) {
        int left = 0,right = arr.length - 1;
        while (right - left > 1){
            int mid = (left + right) / 2;
            if (target <= arr[mid]){
                right = mid;
            } else{
                left = mid;
            }
        }
        if (arr[left] == target)
            return left;
        if(arr[right] == target)
            return right;
        return -1;
    }

    private static int foundright(int target,int[] arr) {
        int left = 0,right = arr.length - 1;
        while (right - left > 1){
            int mid = (left + right) / 2;
            if (target < arr[mid]){
                right = mid;
            } else{
                left = mid;
            }
        }
        if(arr[right] == target)
            return right;
        if (arr[left] == target)
            return left;
        return -1;
    }
}

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

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

相关文章

鸿蒙Harmony应用开发—ArkTS(stateStyles:多态样式)

Styles和Extend仅仅应用于静态页面的样式复用&#xff0c;stateStyles可以依据组件的内部状态的不同&#xff0c;快速设置不同样式。这就是我们本章要介绍的内容stateStyles&#xff08;又称为&#xff1a;多态样式&#xff09;。 概述 stateStyles是属性方法&#xff0c;可以…

python项目格式代码风格

Visual Studio Code 选择使用 black 作为代码格式化工具,保证提交代码风格的统一 1. Install black pip install black2. Install black and isort extension for vscode: 3. 设定black及isort的格式化配置 3.1. ctrl + , 打开配置面板 3.2. 在弹出的json配置中添加,&quo…

周末总结(2024/03/23)

工作 上周末学习了精力管理&#xff0c;但是没有使用成功&#xff0c;总结了一下&#xff0c;有两点没有做到&#xff1a; 接受破烂现状&#xff0c;开始思考 我还没有完全接受自己的失败&#xff0c;很少跟别人分享自己的生活&#xff0c;需要改进 上周计划做的React练习一…

Nginx 全局块配置汇总

前言 nginx.conf 是 nginx 的主配置文件&#xff0c;配置项分为三大块&#xff0c;events 块和 http 块外面的都是全局块 本文记录最常用的全局块配置汇总&#xff0c;对于比较重要或复杂的配置项则另起文章总结&#xff0c;对应配置项中有文章地址 user user 指令用于配置运…

【ORB-SLAM3】在 Ubuntu20.04 上编译 ORM-SLAM3 并使用 D435i 运行测试

【ORB-SLAM3】在 Ubuntu20.04 上编译 ORM-SLAM3 并使用 D435i 运行测试 1 Prerequisites1.1 C11 or C0x Compiler1.2 Pangolin1.3 OpenCV1.4 Eigen3 2 安装 Intel RealSense™ SDK 2.02.1 测试设备2.2 编译源码安装 3 编译 ORB-SLAM34 使用 D435i 运行 ORB-SLAM34.1 运行4.2 运…

Matlab使用教程(持续更新)

1. Matlab Matlab被广泛的应用在数据分析&#xff0c;汽车仿真&#xff0c;机器人以及医学研究等众多方面。 它可以帮助我们理解研究复杂的系统。 在60年代和70年代&#xff0c;计算机使得科学家和工程师完成了以前不可能进行的计算&#xff1b;但是需要懂得计算机编程。 C…

[学习笔记]CNN代码实战

参考资料&#xff1a; 1.https://www.bilibili.com/video/BV1zF411V7xu 2.项目1&#xff1a;基于经典网络架构&#xff08;resnet&#xff09;训练图像分类模型&#xff08;及flask部署&#xff09; 思维导图

vue3项目初始化

初始化项目newsapp VSCode 打开终端&#xff0c;newsapp项目目录&#xff0c;可自定义 vue create newsapp 有提示“因为在此系统上禁止运行脚本”的话&#xff0c;请执行 set-ExecutionPolicy RemoteSigned 执行后再重复执行vue create newsapp 注意选择Vue 3版本 测试项…

【prompt六】MaPLe: Multi-modal Prompt Learning

1.motivation 最近的CLIP适应方法学习提示作为文本输入,以微调下游任务的CLIP。使用提示来适应CLIP(语言或视觉)的单个分支中的表示是次优的,因为它不允许在下游任务上动态调整两个表示空间的灵活性。在这项工作中,我们提出了针对视觉和语言分支的多模态提示学习(MaPLe),以…

离散数学之范式方法

引子&#xff1a; 对于一个命题&#xff0c;如何判定命题公式为永真式、永假式和可满足的呢或二个命题公式等价。我们学过二种方法&#xff1a; 1&#xff0c;真值表法&#xff1a;对于变元的所有真值指 派&#xff0c;看对应命题公式的真值。2&#xff0c;命题演算方法&#…

Nacos介绍和统一配置管理

Nacos&#xff08;全称为 Alibaba Cloud Nacos&#xff0c;或简称为 Nacos&#xff09;是一个开源的分布式服务发现和配置管理系统。它由阿里巴巴集团开发并开源&#xff0c;旨在帮助开发人员简化微服务架构下的服务注册、发现和配置管理。 一、Nacos 提供了以下主要功能&…

NC 现金流量查询 节点 多账簿联查时,根据所选择的列来判断明细和现金流量联查按钮是否可用,根据添加列选择监听事件处理。

NC 现金流量查询 节点 多账簿联查时&#xff0c;根据所选择的列来判断明细和现金流量联查按钮是否可用&#xff0c;如下图的情况&#xff1a; 在现金流量查询界面UI类的initTable(QueryConditionVO conVO)方法中添加列选择监听事件即可&#xff0c;如下&#xff1a; // 列监听…

[Netty实践] 请求响应同步实现

目录 一、介绍 二、依赖引入 三、公共部分实现 四、server端实现 五、client端实现 六、测试 一、介绍 本片文章将实现请求响应同步&#xff0c;什么是请求响应同步呢&#xff1f;就是当我们发起一个请求时&#xff0c;希望能够在一定时间内同步&#xff08;线程阻塞&am…

【JavaEE初阶系列】——synchronized 的特性(互斥和可重入性)

目录 &#x1f4bb;synchronized 的特性 &#x1f5a5;️互斥及使用示例 &#x1f6a9;锁修饰代码块 &#x1f6a9;锁修饰实例方法/静态方法 &#x1f388;锁修饰实例方法 &#x1f388;锁修饰静态方法 &#x1f6a9;总结 &#x1f5a5;️可重入 &#x1f6a9;死锁的…

AI漫画 角色一致性

具体可以参考油罐我的视频&#xff0c;同名。 1&#xff1a;上传图片 反推提示词 /describe 2&#xff1a;上传图片&#xff0c;获取图片链接&#xff0c;输入提示词 full body shot,Full length,black ninja shoes&#xff0c; Wearing Japanese samurai armor with his zanp…

计算机网络:信道复用技术概念解析

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

Mongodb入门到入土,安装到实战,外包半年学习的成果

这是我参与「第四届青训营 」笔记创作活动的的第27天&#xff0c;今天主要记录前端进阶必须掌握内容Mongodb数据库,从搭建环境到运行数据库,然后使用MongodB; 一、文章内容 数据库基础知识关系型数据库和非关系型数据库为什么学习Mongodb数据库环境搭建及运行MongodbMongodb命…

linux下用docker部署es和kibana(带ik分词器)(二)

在上一篇文章中讲到&#xff0c;我们利用docker安装了es和kibana&#xff0c;下面我们讲解一下在安装es时把ik分词器这个插件集成进去&#xff0c;首先我们编写一个dockerfile文件&#xff0c;自定义一个es镜像&#xff0c;当然这个镜像肯定集成了ik分词器&#xff0c;具体步骤…

在云上部署我的个人博客!!!

这和上一篇是连起来的&#xff0c;大家先整体看一遍&#xff0c;不要跟&#xff0c;前面有些弯路&#xff01;&#xff01;&#xff01; 【这是按时计费的&#xff0c;欠费不能用&#xff0c;交了好几次哈哈哈哈 】 【我买的域名是&#xff1a;128.1.61.228】 【把域名这个位置…

链动2+1模式深度解析:用户留存与复购数据揭秘

大家好&#xff0c;我是吴军&#xff0c;来自一家专注于软件开发的公司&#xff0c;担任产品经理一职。 今天&#xff0c;我想与大家深入探讨一个话题——链动21模式&#xff0c;以及它是如何有效解决用户留存与复购的难题的。 可能有人会说&#xff0c;链动模式已经存在很久了…