每日一题——旋转数组的最小数字(II)

news2024/11/24 14:25:58

旋转数组的最小数字——II

题目链接

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HfqanL7d-1691934029415)(C:\Users\HUASHUO\AppData\Roaming\Typora\typora-user-images\image-20230813204334548.png)]

注:此题是昨天旋转数组的最小数字——I的拓展延伸,昨天题目数组的条件是不会存在重复元素,而本题数组的元素可以重复,因此建议先做前面一题,进行思考,这样求解这一题的过程就会容易理解许多。


旋转数组的性质

由旋转数组的最小数字——I我们知道了:

以数组最右侧数据val为参考对象,最小值右侧的数一定小于val,最小值左边的数一定大于val

可以得到以下图像:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1LUqxiEc-1691934029415)(C:/Users/HUASHUO/AppData/Roaming/Typora/typora-user-images/image-20230813204903425.png)]

而今天这一题多了一个条件:数组中可能存在重复元素。我们需要考虑的情况又复杂了一点:

以数组最右侧数据val为参考对象,最小值右侧的数一定等于小于val,最小值左边的数一定大于等于val

我们同样用二分法来解决:

  • 同样,我们设左边界为left,右边界为right,区间的中间下标为mid

  • 如果nums[mid] > nums[right],和原来一样,最小值一定不在左侧区域,left = mid + 1

  • 如果nums[mid] < nums[right],和原来一样,最小值一定不在右侧区域(但可能就是mid位置的值),right = mid

  • 如果nums[mid]==nums[rihgt],这种情况就值得注意了,如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uNuvbIY4-1691934029416)(C:/Users/HUASHUO/AppData/Roaming/Typora/typora-user-images/image-20230813210527291.png)]

  • 此时,nums[mid]可能在最小值的左边,也可能在最小值的右边,因此我们不能随意地舍去mid左侧的数据或者右侧的数据。对于这种情况的处理,我们有两种方法:

方法一:

不能随意舍去mid左半部分或者右半部分是因为最小值到底是在mid的左边还是右边是不确定的,但是如果我们可以通过处理来确定最小值和mid的关系呢?

我们知道,数组旋转后,其被分割成了两串非递减数列,而令我们困扰的就是诸如这种情况:[3,3,1,3],[4,4,5,1,4,4,4,4,4]。那么我们可以删除数组前面所有等于nums[right]的元素,使数组变成诸如[1,3],[5,1,4,4,4,4]的形式,这样当nums[mid]==nums[right]这种情况出现时,mid就一定会出现在最小值的右侧mid右侧的数据也就可以删除了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-unGjeYsq-1691934029416)(C:/Users/HUASHUO/AppData/Roaming/Typora/typora-user-images/image-20230813212421862.png)]

实现代码

int minArray(int* nums, int numsSize){
    int left = 0;
    int right = numsSize - 1;

    //删除数组前面所有等于nums[right]的元素
    while (left < numsSize && nums[left] == nums[right])
        left++;

    while (left < right)
    {
        int mid = (right - left) / 2 + left;

        //如果中间值大于最右边的值,那么最小值一定在中间值的右边
        if (nums[mid] > nums[right])
            left = mid + 1;
        //否则,最小值就在最右边的值的左边,也可能就是这个中间值
        else
            right = mid;
    }

    return nums[right];
}

方法二

虽然我们不能随意舍弃mid的左半部分或者右半部分,但是我们可以确定,无论nums[right]是不是最小值,都有它的一个替代品nums[mid],因此我们可以删除最右边的数据nums[right]

实现代码

int minArray(int* nums, int numsSize){
    int left = 0;
    int right = numsSize - 1;

    while (left < right)
    {
        int mid = (right - left) / 2 + left;

        //如果中间值大于最右边的值,那么最小值一定在中间值的右边
        if (nums[mid] > nums[right])
            left = mid + 1;

        //如果中间值小于最右边的值,那么最小值一定在中间值的左边或者就是中间值
        else if (nums[mid] < nums[right])
            right = mid;

        //如果中间值等于最右边的值,那么就删除最右侧元素
        else    
            right--;
    }

    return nums[left];
}

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

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

相关文章

python print单引号和双引号区别

python中单引号和双引号有什么区别 942次阅读 没有评论 单引号和双引号 在Python中我们都知道单引号和双引号都可以用来表示一个字符串&#xff0c;比如 str1 python str2 "python" str1和str2是没有任何区别的。但是如果遇到需要转义字符的情况&#xff0c;来…

面试热题(反转字符串中的单词)

给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意&#xff1a;输入字符串 s中可能会存在前导空格、尾随空格…

Skeleton-Aware Networks for Deep Motion Retargeting

Skeleton-Aware Networks for Deep Motion Retargeting解析 摘要1. 简介2. Related Work2.1 运动重定向&#xff08;Motion Retargeting&#xff09;2.2 Neural Motion Processing 3. 概述&#xff08;Overview&#xff09;4. 骨骼感知深度运动处理4.1 运动表征4.2 骨架卷积4.3…

《论文阅读12》RandLA-Net: Efficient Semantic Segmentation of Large-Scale Point Clouds

一、论文 研究领域&#xff1a;全监督3D语义分割&#xff08;室内&#xff0c;室外RGB&#xff0c;kitti&#xff09;论文&#xff1a;RandLA-Net: Efficient Semantic Segmentation of Large-Scale Point Clouds CVPR 2020 牛津大学、中山大学、国防科技大学 论文链接论文gi…

pyqt5多线程(子线程执行将结果返回到主线程上,提示对话框)

pyqt5多线程&#xff08;子线程执行将结果返回到主线程上&#xff0c;提示对话框&#xff09; 1.为什么要多线程执行 在主线程ui界面点击登录后&#xff0c;加延时10s,&#xff08;模拟调用接口登录&#xff0c;假设耗时10s&#xff09;,ui主线程在等待请求返回结果&#xff…

Es、kibana安装教程-ES(二)

上篇文章介绍了ES负责数据存储&#xff0c;计算和搜索&#xff0c;他与传统数据库不同&#xff0c;是基于倒排索引来解决问题的。Kibana是es可视化工具。 分布式搜索ElasticSearch-ES&#xff08;一&#xff09; 一、ElasticSearch安装 官网下载地址&#xff1a;https://www…

Kotlin runBlocking launch多个协程读写mutableListOf时序

Kotlin runBlocking launch多个协程读写mutableListOf时序 import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.runBlockingfun main(args: Array<String>) {var lists mutableListOf<String>()runBlocking {launch {r…

jsoup解析html之table表格

jsoup解析html之table表格 jsoup说明 一款Java 的HTML解析器 jsoup 是一款Java 的HTML解析器&#xff0c;可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API&#xff0c;可通过DOM&#xff0c;CSS以及类似于jQuery的操作方法来取出和操作数据。 主要功能 从一…

Mac M2 Pro安装使用Cocoapods

Mac Pro M2安装使用Cocoapods 在新公司要做iOS开发&#xff0c;所以在新电脑上安装Cocoapods 在升级gem&#xff0c;sudo gem update --system&#xff0c;和安装cocoapods时都遇到如下的提示&#xff1a; ERROR: While executing gem ... (Errno::EPERM)Operation not per…

【MybatisPlus】LambdaQueryWrapper和QueryWapper的区别

个人主页&#xff1a;金鳞踏雨 个人简介&#xff1a;大家好&#xff0c;我是金鳞&#xff0c;一个初出茅庐的Java小白 目前状况&#xff1a;22届普通本科毕业生&#xff0c;几经波折了&#xff0c;现在任职于一家国内大型知名日化公司&#xff0c;从事Java开发工作 我的博客&am…

input 设置type=“number“,鼠标悬停关闭提示语

一、问题 最近刚发现input 设置type"number"之后&#xff0c;鼠标悬停会出现提示语&#xff1a;请输入有效值。两个最接近的有效值分别为xx和xx。想要输入的值确实为number格式&#xff0c;又可以输入小数&#xff0c;不限制小数位&#xff0c;所以要把这讨厌的提示去…

最小路径和——力扣64

文章目录 题目描述动态规划题目描述 动态规划 class Solution {public:int minPathSum(vector<vector<int>>

WebAPIs 第四天

1.日期对象 2.节点操作 3.M端事件 4.JS插件 一.日期对象 实例化时间对象方法时间戳 日期对象&#xff1a;用来表示时间的对象 作用&#xff1a;可以得到当前系统时间 1.1 实例化 ① 概念&#xff1a;在代码中发现了new关键字时&#xff0c;一般将这个操作称为实例化 …

Controller是线程安全吗?如何实现线程安全

测试是否是线程安全 RequestMapping("/test") RestController public class TestController {//1、定义num&#xff0c;判断不同线程访问的时候&#xff0c;num的返回结果是否一致private Integer num0;/*** 2、定义两个方法*/GetMapping("/count1")publi…

一个注解实现分布式锁

文章首发微信公众号《java知路》 分布式锁原理 分布式锁是一种用于在分布式系统中协调多个节点并保证数据一致性的机制。它的目的是在分布式环境下实现互斥访问共享资源&#xff0c;以防止多个节点同时对共享资源进行修改或读取&#xff0c;从而保证数据的正确性和一致性。 实…

单向-->不带头-->非循环链表(简称:单链表)

目录 一、链表的介绍 1.链表的概念 2.单链表的节点类型 3.单链表简图 二、单链表的增删查改 1.单链表的头插 2.单链表的尾插 3.单链表的头删 4.单链表的尾删 5.单链表pos位置之后插入一个节点 6.单链表删除pos位置后的一个节点 一、链表的介绍 1.链表的概念 链表是一…

如何搬运订单(1688)

目录 下载安装与运行 任务描述 搬运具体要求&#xff08;示例&#xff09; 订单导出操作过程 搜索指定范围的订单 选择要导出的订单数据 完整的导出动画演示 切换到另一个账号 B账号批量下单的要求 下单步骤 下单设置 为啥选加采购车而不是立即下单 为啥要选自动情…

Java-方法

在编程中&#xff0c;我们也可以将频繁使用的代码封装成"帖子"(方法)&#xff0c;需要时直接拿来链接 方法就是一个代码片段. 类似于 C 语言中的 “函数” 方法定义 修饰符 返回值类型 方法名称([参数类型 形参 …]){ 方法体代码; [return 返回值]; } 这里比得C语言…

关于视频人工智能/机器视觉创业商业模式的一些思考

今年开始了我的第二次创业&#xff0c;第一次创业大家看我以前的博客就知道了&#xff0c;做音视频流媒体相关技术的&#xff0c;现在公司也已经是安徽省专精特新中小企业了&#xff0c;还好是“中小企业”&#xff0c;如果直接是专精特新企业&#xff0c;我就可以不用来视频人…

地理测绘基础知识(2)-椭球最短距离计算

在上一篇中&#xff0c;我们介绍了ECEF坐标系和经纬度的互换。 本篇&#xff0c;主要介绍已知A\B两个点的经纬度&#xff0c;如何求取椭球上的最短距离、路径。 在标准椭球面上&#xff0c;从A点运动到B点&#xff0c;距离如何&#xff0c;轨迹、每个阶段的方向又是如何呢&am…