【二分】搜索旋转数组

news2024/11/16 18:57:28

文章目录

  • 不重复数组找最小值,返回下标
  • 重复数组找最小值,返回下标
  • 不重复数组找target,返回下标
  • 重复数组找target,返回bool
  • 重复数组找target,返回下标

不重复数组找最小值,返回下标

在这里插入图片描述

在这里插入图片描述

class Solution {
    public int findMin(int[] nums) {
        int n = nums.length;
        int l = 0;
        int r = n - 1;
        while(l <= r){
            if(l == r || nums[l] < nums[r]){
                break;
            }
            int mid = l + (r - l) / 2;
            if(nums[mid] >= nums[l]){
                // [l, mid]有序
                l = mid + 1;
            }else{
                // [mid, r]有序
                r = mid;
            }
        }
        return nums[l];
    }
}
class Solution {
    public int findMin(int[] nums) {
        int n = nums.length;
        int l = 0;
        int r = n - 1;
        while(l <= r){
            if(l == r || nums[l] <= nums[r]){
                // [l,r]已经有序
                break;
            }
            int mid = l + (r - l) / 2;
            if(nums[mid] > nums[l]){
                l = mid + 1;
            }else if(nums[mid] < nums[l]){
                r = mid;
            }else{
                l++;
            }
        }
        return nums[l];
    }
}

重复数组找最小值,返回下标

在这里插入图片描述

在这里插入图片描述

nums[mid] < nums[l],说明最小值肯定在(low, mid]区间内,则r = mid

在这里插入图片描述
nums[mid] > nums[l],说明最小值肯定在mid右侧,(mid,r]区间内,则l = mid + 1

在这里插入图片描述

nums[mid] == nums[l],无法判断最小值在哪个区间,但一定在(l, r]内部
我们假设nums[l]、nums[mid]就是最小值,那我们可以排除l,即l++,因为nums[mid]可以替代nums[l]
若nums[l]、nums[mid]不是最小值,我们直接l++

寻找旋转排序数组中的最小值 II

class Solution {
    public int findMin(int[] nums) {
        int n = nums.length;
        int l = 0;
        int r = n - 1;
        while(l <= r){
            if(l == r || nums[l] <= nums[r]){
                // [l,r]已经有序
                break;
            }
            int mid = l + (r - l) / 2;
            if(nums[mid] > nums[l]){
                l = mid + 1;
            }else if(nums[mid] < nums[l]){
                r = mid;
            }else{
                l++;
            }
        }
        return nums[l];
    }
}

不重复数组找target,返回下标

在这里插入图片描述

class Solution {
    public int search(int[] nums, int target) {
        int n = nums.length;
        int l = 0;
        int r = n - 1;
        while(l <= r){
            int mid = l + (r - l) / 2;
            if(target == nums[mid]){
                return mid;
            }
            if(nums[mid] > nums[l]){
                // [l, mid]有序
                if(target >= nums[l] && target < nums[mid]){
                    // 在有序区间内
                    r = mid - 1;
                }else{
                    l = mid + 1; 
                }
            }else if(nums[mid] < nums[l]){
                // [mid, r]有序
                if(target > nums[mid] && target <= nums[r]){
                    // 在有序区间内
                    l = mid + 1;
                }else{
                    r = mid - 1; 
                }
            }else{
                l++;
            }
        }
        return -1;
    }
}

重复数组找target,返回bool

在这里插入图片描述

class Solution {
    public int search(int[] nums, int target) {
        int n = nums.length;
        int l = 0;
        int r = n - 1;
        while(l <= r){
            int mid = l + (r - l) / 2;
            if(target == nums[mid]){
                return mid;
            }
            if(nums[mid] > nums[l]){
                // [l, mid]有序
                if(target >= nums[l] && target < nums[mid]){
                    // 在有序区间内
                    r = mid - 1;
                }else{
                    l = mid + 1; 
                }
            }else if(nums[mid] < nums[l]){
                // [mid, r]有序
                if(target > nums[mid] && target <= nums[r]){
                    // 在有序区间内
                    l = mid + 1;
                }else{
                    r = mid - 1; 
                }
            }else{
                l++;
            }
        }
        return -1;
    }
}

重复数组找target,返回下标

在这里插入图片描述

class Solution {
    public int search(int[] nums, int target) {
        int l = 0;
        int r = nums.length - 1;
        if (r == -1)
            return -1;
        while (l < r) {                                         // 循环结束条件l==r
            int mid = l + (r - l) / 2;
            if (nums[l] < nums[mid]) {                              // 如果左值小于中值,说明左边区间升序               
                if (nums[l] <= target && target <= nums[mid]) {     // 如果目标在左边的升序区间中,右边界移动到mid
                    r = mid;
                } else {                                               // 否则目标在右半边,左边界移动到mid+1
                    l = mid + 1;
                }
            } else if (nums[l] > nums[mid]) {                       // 如果左值大于中值,说明左边不是升序,右半边升序
                if (nums[l] <= target || target <= nums[mid]) {     // 如果目标在左边,右边界移动到mid
                    r = mid;
                } else {                                               // 否则目标在右半边,左边界移动到mid+1
                    l = mid + 1;
                }
            } else if (nums[l] == nums[mid]) {                      // 如果左值等于中值,可能是已经找到了目标,也可能是遇到了重复值
                if (nums[l] != target) {                            // 如果左值不等于目标,说明还没找到,需要逐一清理重复值。
                    l++;
                } else {                                               // 如果左值等于目标,说明已经找到最左边的目标值 
                    r = l;                                      // 将右边界移动到l,循环结束
                }
            }
        }
        return (nums[l] == target) ? l : -1;                     // 返回l,或者-1
    }
}

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

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

相关文章

js中作用域的理解?

1.作用域 作用域&#xff0c;即变量(变量作用域又称上下文)和函数生效(能被访问)的区域或集合 换句话说&#xff0c;作用域决定了代码区块中变量和其他资源的可见性 举个例子 function myFunction() {let inVariable "函数内部变量"; } myFunction();//要先执行这…

SOLIDWORKS提高装配效率的方法:随配合复制

SOLIDWORKS用户在工程装配设计中会经常遇到这样的问题&#xff0c;在同一个装配体中某个零件需要调入多次&#xff0c;虽然装配位置可能不同&#xff0c;但是配合方式基本一致&#xff0c;传统的方法是多次插入该零件&#xff0c;然后添加配合关系&#xff0c;过程比较繁琐&…

多传感器时间同步

文章目录 存在的问题可能的解决方法 存在的问题 不同的传感器记录的时间存在差异&#xff0c;若是不进行同步操作&#xff0c;会导致融合结果异常&#xff0c;这是我可视化后的轨迹&#xff0c;存在大幅度抖动。 未同步的imu和gps融合 gps轨迹 可能的解决方法 在ROS中&am…

vite+vue3配置环境变量

首先在项目根目录添加环境文件&#xff0c;比如有测试环境、开发环境、生产环境&#xff1a; 环境说明 .env&#xff1a;所有环境都会加载.env.development&#xff1a;开发环境加载.env.production&#xff1a;生产环境加载.env.test&#xff1a;测试环境加载 语法说明 变量…

《存储IO路径》专题:数据魔法师DMA

初识DMA 大家好,今天我要给大家介绍一位在计算机世界中不可或缺的魔法师——DMA(Direct Memory Access)。让我们一起揭开这位魔法师的神秘面纱,看看它是如何让数据在内存之间自由穿梭的。 DMA这位魔法师可是大有来头。在现代计算机系统中,CPU、内存和各种设备之间需要进…

【微服务】05-网关与BFF(Backend For Frontend)

文章目录 1.打造网关1.1 简介1.2 连接模式1.3 打造网关 2.身份认证与授权2.1 身份认证方案2.1.1 JWT是什么2.1.2 启用JwtBearer身份认证2.1.3 配置身份认证2.1.4 JWT注意事项 1.打造网关 1.1 简介 BFF(Backend For Frontend)负责认证授权&#xff0c;服务聚合&#xff0c;目标…

TMS FlexCel Studio for VCL and FireMonkey Crack

TMS FlexCel Studio for VCL and FireMonkey Crack FlexCel for VCL/FireMonkey是一套允许操作Excel文件的Delphi组件。它包括一个广泛的API&#xff0c;允许本机读取/写入Excel文件。如果您需要在没有安装Excel的Windows或macOS机器上阅读或创建复杂的电子表格&#xff0c;Fle…

skywalking服务部署

一、前言 Apache SkyWalking 是一个开源的分布式跟踪、监控和诊断系统&#xff0c;旨在帮助用户监控和诊断分布式应用程序、微服务架构和云原生应用的性能和健康状况。它提供了可视化的分析工具&#xff0c;帮助开发人员和运维团队深入了解应用程序的性能、调用链和异常情况 …

spring整合MybatisAOP整合PageHelper插件

一&#xff0c;spring集成Mybatis的概念 Spring 整合 MyBatis 是将 MyBatis 数据访问框架与 Spring 框架进行集成&#xff0c;以实现更便捷的开发和管理。在集成过程中&#xff0c;Spring 提供了许多特性和功能&#xff0c;如依赖注入、声明式事务管理、AOP 等 它所带来给我们的…

C++笔记之静态成员函数可以在类外部访问私有构造函数吗?

C笔记之静态成员函数可以在类外部访问私有构造函数吗&#xff1f; code review! 静态成员函数可以在类外部访问私有构造函数。在C中&#xff0c;访问控制是在编译时执行的&#xff0c;而不是在运行时执行的。这意味着静态成员函数在编译时是与类本身相关联的&#xff0c;而不…

Linux(基础篇一)

Linux基础篇 Linux基础篇一1. Linux文件系统与目录结构1.1 Linux文件系统1.2 Linux目录结构 2. VI/VIM编辑器2.1 vi/vim是什么2.2 模式间的转换2.3 一般模式2.4 插入模式2.4.1 进入编辑模式2.4.2 退出编辑模式 2.5 命令模式 3. 网络配置3.1 网络连接模式3.2 修改静态ip3.3 配置…

ubuntu下自启动设置,为了开机自启动launch文件

1、书写sh脚本文件 每隔5秒钟启动一个launch文件&#xff0c;也可以直接在一个launch文件中启动多个&#xff0c;这里为了确保启动顺利&#xff0c;添加了一些延时 #! /bin/bash ### BEGIN INIT sleep 5 gnome-terminal -- bash -c "source /opt/ros/melodic/setup.bash…

4.12 TCP 连接,一端断电和进程崩溃有什么区别?

目录 TCP keepalive TCP 的保活机制 主机崩溃 进程崩溃 有数据传输的场景 客户端主机宕机&#xff0c;又迅速重启 客户端主机宕机&#xff0c;一直没有重启 TCP连接服务器宕机和进程退出情况总结 TCP keepalive TCP 的保活机制 TCP 保活机制需要通过 socket 接口设置 S…

算法学习——递归

引言 从这个专栏开始&#xff0c;我们将会一起来学习算法知识。首先我们要一起来学习的算法便是递归。为什么呢&#xff1f;因为这个算法是我很难理解的算法。我希望通过写这些算法博客&#xff1b;来加深自己对于递归算法的理解和运用。当然&#xff0c;学习算法最快的方式便是…

一文解析block io生命历程

作为存储业务的一个重要组成部分&#xff0c;block IO是非易失存储的唯一路径&#xff0c;它的生命历程每个阶段都直接关乎我们手机的性能、功耗、甚至寿命。本文试图通过block IO的产生、调度、下发、返回的4个阶段&#xff0c;阐述一个block IO的生命历程。 一、什么是块设备…

Python“牵手”lazada商品列表数据,关键词搜索lazadaAPI接口数据,lazadaAPI接口申请指南

lazada平台API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范&#xff0c;lazadaAPI接口是指通过编程的方式&#xff0c;让开发者能够通过HTTP协议直接访问lazada平台的数据&#xff0c;包括商品信息、店铺信息、物流信息等&#xff0c;从而实现la…

安装启动yolo5教程

目录 一、下载yolo5项目 二、安装miniconda&#xff08;建议不要安装在C盘&#xff09; 三、安装CUDA 四、安装pytorch 五、修改配置参数 六、修改电脑参数 七、启动项目 博主硬件&#xff1a; Windows 10 家庭中文版 一、下载yolo5项目 GitHub - ultralytics/yolov5:…

C++笔记之智能指针和单例、依赖注入结合使用

C笔记之智能指针和单例、依赖注入结合使用 code review! 文章目录 C笔记之智能指针和单例、依赖注入结合使用例1.一个类不使用单例&#xff0c;另一个类使用单例例2.两个类都使用单例&#xff0c;并且通过getInstance()传入类的实例例3.std::make_unique不能访问私有的构造函…

python将png格式的图片转换为jpg格式的图片

png图片是4通道 RGBA图像&#xff0c;具有4个通道&#xff08;红色、绿色、蓝色和透明度&#xff09;&#xff0c;用于表示彩色图像以及透明度信息。 只是简单的修改后缀&#xff0c;并不能将png格式图片改为jpg格式。 将png格式的图片转换为jpg格式的图片 确保安装了pillow库…

自启动遇到某个节点或者某种环境变量问题导致启动失败

前言&#xff1a;此次记录无人车自启动过程遇到的问题。为了让ROS无人车能够实现飞控进行室外自主航线的问题&#xff0c;将飞控发布的PWM转为ROS无人车对应的速度。为了确保无人车启动后能够使用遥控器控制无人车&#xff0c;所以需要开机自启动。 硬件&#xff1a; 1、star…