【二分】搜索旋转数组

文章目录

  • 不重复数组找最小值,返回下标
  • 重复数组找最小值,返回下标
  • 不重复数组找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
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows下 MySql通过拷贝data目录迁移数据库的方法

MySQL数据库的文件目录下图所示&#xff0c; 现举例说明通过COPY文件夹data下数据库文件&#xff0c;进行数据拷贝的步骤&#xff1b;源数据库运行在A服务器上&#xff0c;拷贝到B服务器&#xff0c;假定B服务器上MySQL数据库已经安装完成&#xff0c;为空数据库。 首先进入A服…

华为云渲染实践

// 编者按&#xff1a;云计算与网络基础设施发展为云端渲染提供了更好的发展机会&#xff0c;华为云随之长期在自研图形渲染引擎、工业领域渲染和AI加速渲染三大方向进行云渲染方面的探索与研究。本次LiveVideoStackCon 2023上海站邀请了来自华为云的陈普&#xff0c;为大家分…

百度“AI智障”到AI智能体验之旅

目录 前言一、百度PLATO1.抬杠第一名2.听Ta瞎扯淡3.TA当场去世了4.智障与网友的高光时刻 二、文心一言1.设计测试用例2.随意发问3.手机端约会神器 三、体验总结&#xff1a;四、千帆大模型 前言 最近收到了文心一言3.5大模型的内测资格&#xff0c;正巧之前也体验过它的前身&q…

Request对象和response对象

一、概念 request对象和response对象是通过Servlet容器&#xff08;如Tomcat&#xff09;自动创建并传递给Servlet的。 Servlet容器负责接收客户端的请求&#xff0c;并将请求信息封装到request对象中&#xff0c;然后将request对象传 递给相应的Servlet进行处理。类似地&…

SpringBoot入门篇1 - 简介和工程创建

目录 SpringBoot是由Pivotal团队提供的全新框架&#xff0c; 其设计目的是用来简化Spring应用的初始搭建以及开发过程。 1.创建入门工程案例 ①创建新模块&#xff0c;选择Spring初始化&#xff0c;并配置模块相关基础信息 ②开发控制器类 controller/BookController.jav…

短视频矩阵系统接口部署技术搭建

前言 短视频矩阵系统开发涉及到多个领域的技术&#xff0c;包括视频编解码技术、大数据处理技术、音视频传输技术、电子商务及支付技术等。因此&#xff0c;短视频矩阵系统开发人员需要具备扎实的计算机基础知识、出色的编程能力、熟练掌握多种开发工具和框架&#xff0c;并掌握…

全套解决方案:基于pytorch、transformers的中文NLP训练框架,支持大模型训练和文本生成,快速上手,海量训练数据!

全套解决方案&#xff1a;基于pytorch、transformers的中文NLP训练框架&#xff0c;支持大模型训练和文本生成&#xff0c;快速上手&#xff0c;海量训练数据&#xff01; 1.简介 目标&#xff1a;基于pytorch、transformers做中文领域的nlp开箱即用的训练框架&#xff0c;提…

开源网安受邀参加软件供应链安全沙龙,推动企业提升安全治理能力

​8月23日下午&#xff0c;合肥软件行业软件供应链安全沙龙在中安创谷科技园举办。此次沙龙由合肥软件产业公共服务中心联合中安创谷科技园公司共同主办&#xff0c;开源网安软件供应链安全专家王晓龙、尹杰受邀参会并带来软件供应链安全方面的精彩内容分享&#xff0c;共同探讨…

政府网站定期巡检:构建高效、安全与透明的数字政务

在数字时代&#xff0c;政府网站已不仅仅是一个信息发布窗口&#xff0c;更是政府与公众互动的桥梁、政务服务的主要渠道以及数字化治理的重要平台。因此&#xff0c;确保政府网站的高效运行、信息安全与透明公开就显得尤为重要。在此背景下&#xff0c;定期的网站巡检与巡查成…

xfs ext4 结合lvm 扩容、缩容 —— 筑梦之路

ext4 文件系统扩容、缩容操作 扩容系统根分区 根文件系统在 /dev/VolGroup/lv_root 逻辑卷上&#xff0c;文件系统类型为ext4&#xff0c;大小为10G&#xff0c;现在要将其扩容成20G。 给空闲空间分区# 调整分区类型为LVM&#xff0c;也就是8e类型 fdisk /dev/sdb# 选定分区后使…

2023年高教社杯 国赛数学建模思路 - 案例:FPTree-频繁模式树算法

文章目录 算法介绍FP树表示法构建FP树实现代码 建模资料 ## 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模式树算法&#xff0c…

JavaScript函数调用其他函数

在JavaScript中&#xff0c;函数可以调用其他函数。这通常被称为函数组合&#xff0c;它允许你通过将较简单的函数组合在一起来创建更复杂的功能。 例如&#xff1a;还是以之前的水果加工举例&#xff0c;但是现在我们需要输出&#xff0c;这个苹果有几块&#xff0c;橘子有几块…

计算机竞赛 基于大数据的时间序列股价预测分析与可视化 - lstm

文章目录 1 前言2 时间序列的由来2.1 四种模型的名称&#xff1a; 3 数据预览4 理论公式4.1 协方差4.2 相关系数4.3 scikit-learn计算相关性 5 金融数据的时序分析5.1 数据概况5.2 序列变化情况计算 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &…

基于Java的旅游信息推荐系统设计与实现,springboot+vue,MySQL数据库,前后端分离,完美运行,有三万字论文。

基于Java的旅游信息推荐系统设计与实现&#xff0c;springbootvue&#xff0c;MySQL数据库&#xff0c;前后端分离&#xff0c;完美运行&#xff0c;有三万字论文。 前台主要功能&#xff1a;登录注册、旅游新闻、景区信息、美食信息、旅游线路、现在留言、收藏、预定旅游线路…

CAD打开对象捕捉设置的快捷键是什么?

CAD打开对象捕捉设置的快捷键是什么呢&#xff1f;今天就教大家如何操作。 方法 打开对象捕捉设置的快捷命令:SE。空格确定即可。 也可以输入快捷命令&#xff1a;DS也一样可以打开对象捕捉设置。血糖测试仪什么牌子好&#xff1f;盘点血糖检测仪的三大品牌&#xff01; | 共…

visual studio 2022.NET Core 3.1 未显示在目标框架下拉列表中

问题描述 在Visual Studio 2022我已经安装了 .NET core 3.1 并验证可以运行 .NET core 3.1 应用程序&#xff0c;但当创建一个新项目时&#xff0c;目标框架的下拉列表只允许 .NET 6.0和7.0。而我在之前用的 Visual Studio 2019&#xff0c;可以正确地添加 .NET 核心项目。 …

【附源码】Axure RP Pro8.0安装教程|HTML|网页设计

软件下载 软件&#xff1a;Axure版本&#xff1a;8.0语言&#xff1a;简体中文大小&#xff1a;82.53M安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff09;下载通道①百度网盘丨下载链接&#xff1a;https://pan.baidu.com/s/…

力扣:74. 搜索二维矩阵(Python3)

题目&#xff1a; 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非递减顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返…

C语言基础之——数组

前言&#xff1a;本篇文章&#xff0c;我们将对一维数组&#xff0c;和二维数组进行展开式的讲解&#xff0c;并进行实际应用。 目录 一.一维数组 1.一维数组的创建和初始化 &#xff08;1&#xff09;数组的创建 &#xff08;2&#xff09;数组的初始化 2.一维数组的使用…

Leetcode76. 最小覆盖子串

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 "" 。 注意&#xff1a; 对于 t 中重复字符&#xff0c;我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。如果…