剑指 Offer 11. 旋转数组的最小数字解题思路

news2024/12/30 3:31:08

文章目录

  • 题目
  • 解题思路
    • 优化

题目

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。

给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为 1。

注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]] 。

示例 1:

输入:numbers = [3,4,5,1,2]
输出:1

示例 2:

输入:numbers = [2,2,2,0,1]
输出:0

提示:

n == numbers.length
1 <= n <= 5000
-5000 <= numbers[i] <= 5000
numbers 原来是一个升序排序的数组,并进行了 1 至 n 次旋转

解题思路

除了原数组外(升序),最小值不论旋转几次,都在最大值的后面

public class Solution {
    public int MinArray(int[] numbers) 
    {
        int tmp = numbers[0];
        int sm = tmp;
        for(int i = 0 ;i<numbers.Length;i++)
        {
            if(tmp<=numbers[i])
            {
                tmp = numbers[i];
            }
            else
            {
                sm = numbers[i];
                tmp = sm;
            }
        }
        return sm;
    }
}

在这里插入图片描述

优化

因为原数组是升序的,所以旋转后数组的最小元素就是旋转点
如果nums中没有重复元素,那么对于nums[x],nums[x]>nums[0],说明x在旋转点左边,若nums[x]<nums[0],说明x在旋转点右边或者就是旋转点,找出满足nums[x]<nums[0]的最小的x即可
本题存在重复元素,也就是说在nums[x]==nums[0]的情况下,x既有可能是在旋转点左边,也有可能在右边。参考例子[1,1,1,0,1,1],旋转点为3,同时nums[2]==nums[4]==nums[0]==1
进一步分析可知,只有nums的尾部存在若干和nums[0]相等的元素,才会产生这种情况。并且,去掉这些尾部的元素,不会影响结果。因为:

若nums[0]是答案,我们不会删除nums[0],最后数组中只剩下nums[0]
若nums[0]不是答案,那么去掉数组尾部的若干个和nums[0]相等的元素不影响对正确答案的搜索

去掉尾部元素之后,数组重新恢复二段性,不过和第上面2条略有区别:当nums[x]>=nums[0]的时候,x在旋转点左边。
我们要找的答案就是符合nums[x]<nums[0]的x的最小值。如果二分搜索的结果x不满足条件,说明不存在旋转点,这种情况时nums[0]就是最小值
通常情况下,时间复杂度为O(logn),最坏情况下(数组中的元素都一样),时间复杂度为O(n)通常情况下,时间复杂度为O(logn),最坏情况下(数组中的元素都一样),时间复杂度为O(n)通常情况下,时间复杂度为O(logn),最坏情况下(数组中的元素都一样),时间复杂度为O(n)
空间复杂度为O(1)空间复杂度为O(1)空间复杂度为O(1)

作者:tandztc
链接:https://leetcode.cn/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof/solutions/1038193/guan-jian-zai-yu-xian-hui-fu-shu-zu-de-e-4v6w/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

public class Solution {
    public int MinArray(int[] numbers) {
        int l=0,r=numbers.Length-1;
        //先去掉尾部和首元素相同的元素,恢复数组的二段性
        //处理之后,数组分为2段:前一段的元素都大于等于numbers[0]
        //后一段元素都小于numbers[0]
        //我们的目标是找到数组的最小值,根据题意,就是数组中第一个小于numbers[0]的元素,
        //也就是后一段的第一个元素
        while(l<r&&numbers[l]==numbers[r]) r--;
        while(l<r)
        {
            var mid = l+(r-l)/2;
            if(numbers[mid]<numbers[0]) r=mid;
            else l=mid+1;
        }
        //判断是找到了还是没找到,如果找到了,返回找到的值,如果没找到,那第一个元素就是最小的
        if(numbers[r]<numbers[0]) return numbers[r];
        else return numbers[0];
    }
}

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

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

相关文章

直流电机 PID 开发指南学习笔记

直流电机 PID 开发指南 &#xff08;基于【平衡小车之家】直流电机 PID 学习套件 1.0&#xff09; 目录 1.位置闭环控制 1.1 理论分析 1.2 控制原理图 1.3 C 语言实现 1.4 参数整定 2.速度闭环控制 2.1 理论分析 2.2 控制原理图 2.3 C 语言实现 PID 调节器出现于上世…

keepalived脑裂后,近20min不能访问虚拟IP事故分析

问题现象和说明 真实的场景比较复杂&#xff0c;抽象起来可以用下面的图表示&#xff0c; #mermaid-svg-q8mZrLctqAENT1r0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-q8mZrLctqAENT1r0 .error-icon{fill:#5522…

【经验总结】浮点数double/float精度误差问题总结

现象 最近做的项目中经常会在C环境下和高精度的double浮点类型数据打交道 这些double类型数据精度级别可能到 pico级别(10^-12) 甚至 femto级别(10^-15),用来表示集成电路的一些微观属性 但是非常诡异的是&#xff0c;不知道为什么在对这些高精度的浮点数进行运算时&#xff…

RK3588平台开发系列讲解(工具篇)ADB的使用

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、连接设备1.1、USB 的方式1.2、网络的方式二、常用命令沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍ADB的使用。 一、连接设备 1.1、USB 的方式 主机通过 USB 连接设备,具体如何连接。 US…

chatgpt赋能python:Python中5%-3的用法介绍

Python中5%-3的用法介绍 在Python编程中&#xff0c;5%-3是一个常用的运算符&#xff0c;其作用是对5除以3取余数。在本文中&#xff0c;我将介绍5%-3的用法以及如何在Python编程中使用该运算符。 什么是5%-3运算符 5%-3运算符表示对5除以3取余数&#xff0c;余数为2。 5%-…

chatgpt赋能python:Python中9/2的结果为4.5——一篇关于Python运算符的SEO文章

Python中9/2的结果为4.5——一篇关于Python运算符的SEO文章 如果你是一名Python开发工程师&#xff0c;那么你肯定熟悉运算符这个概念。作为一门计算机语言&#xff0c;Python中有各种各样的运算符&#xff0c;包括算术运算符、赋值运算符、比较运算符等等。今天&#xff0c;我…

WiFi 6 vs WiFi 5

在现代无线通信领域&#xff0c;WiFi已经成为人们日常生活中不可或缺的一部分。随着技术的不断发展&#xff0c;WiFi标准也在不断更新和演进。WiFi 6&#xff08;802.11ax&#xff09;和WiFi 5&#xff08;802.11ac&#xff09;是当前两个主要的WiFi标准。 本文将详细介绍WiFi …

大佬联合署名!反对 ACL 设置匿名期!

夕小瑶科技说 原创 作者 | 智商掉了一地、Python 近日&#xff0c;自然语言处理领域的多位知名学者联合发起了一项反对 ACL 设置匿名期的联合署名行动&#xff0c;包括著名学者 William Wang 和 Yoav Goldberg 在内&#xff0c;还有Christopher Potts、Hal Daume、Luke Zettl…

Springboot +spring security,认证方式---HTTP基本认证的实现

一.简介 这篇文章来学习下security的认证方式其中的HTTP基本认证。 二.Spring Security的认证方式 2.1什么是认证 认证: 就是用来判断系统中是否存在某用户&#xff0c;并判断该用户的身份是否合法的过程&#xff0c;解决的其实是用户登录的问题。认证的存在&#xff0c;是…

2023年系统分析师案例及论文(回忆版)

2023年5月27日&#xff0c;全国计算机等级上半年考试如期举行&#xff0c;北京市软件分析师考试地点在北京市对外贸易学校&#xff0c;早上外面下起雨 看考场分布图&#xff0c;44个考场&#xff0c;推测有44*301320名考生&#xff0c;本人所在的考场&#xff0c;实际到场17人…

【SpringCloud组件——GateWay】

前言&#xff1a; 在我们之前所用的Nacos和Feign以及Eureka&#xff0c;这些组件都是用与系统内部之间进行互相访问的&#xff0c;但是当用户访问系统时&#xff0c;我们没有采取任何措施&#xff0c;举个例子&#xff1a;系统管理员可以访问哪些接口并具备哪些操作权限&#…

chatgpt赋能python:Python中0的SEO优化综述

Python中0的SEO优化综述 在Python编程中&#xff0c;数字0是一个非常重要的数值&#xff0c;它有许多用途和应用。在SEO优化中&#xff0c;合理地应用0可以帮助我们提高网站排名和用户体验。本文将介绍Python中0的一些具体应用以及如何进行合理的SEO优化。 0的应用 0作为标记…

张小飞的Java之路——第四十一章——File

写在前面&#xff1a; 视频是什么东西&#xff0c;有看文档精彩吗&#xff1f; 视频是什么东西&#xff0c;有看文档速度快吗&#xff1f; 视频是什么东西&#xff0c;有看文档效率高吗&#xff1f; 介绍 诸小亮&#xff1a;从今天开始&#xff0c;我们学习 IO 流 张小飞…

CAPL(vTESTStudio) - CAPL控制程控电源IT6332A

目录 为什么要使用CAPL控制程控电源? 一、程控电源的选择 二、程控电源通信协议

Junit5单元测试框架详解

前面我们学习了Selenium自动化测试框架&#xff0c;但是有的时候测试用例会很多&#xff0c;我们需要一个工具来管理这些测试用例&#xff0c;而Junit就是一个很好的管理工具&#xff0c;简单点来说&#xff0c;Junit就是一个针对Java的单元测试框架&#xff1b; 目录 一. 关于…

凸优化系列——凸集

1.最优化问题概述 最优化问题是决策问题&#xff0c;选择一些可以执行的策略使得目标最优;一个最优化问题包括 决策变量;一个或多个目标函数;一个由可行策略组成的集合&#xff0c;可由等式或者不等式刻画; 最优化问题的形式&#xff1a; 最优化问题的分类 无约束优化问题和…

【C++】函数 - 定义,调用,值传递,常见样式,声明,分文件编写

文章目录 1. 函数的定义2. 函数的调用3. 值传递4. 常见的样式5. 函数的声明6. 函数的分文件编写 所谓数组&#xff0c;就是一个集合&#xff0c;里边存放了相同类型的数据元素。 特点1&#xff1a;数组中的每个数据元素都是相同的数据类型 特点2&#xff1a;数组是由连续的内存…

chatgpt赋能python:Python在SEO中的作用:不简单的搜索引擎优化工具

Python在SEO中的作用&#xff1a;不简单的搜索引擎优化工具 Python作为一种强大的编程语言&#xff0c;已经在各个领域中得到了广泛的应用。在搜索引擎优化&#xff08;SEO&#xff09;领域&#xff0c;Python也发挥了重要作用。 Python在SEO中的应用 程序化爬虫 很多SEO工…

(c语言)将一句话的单词进行倒置,标点不倒置(i like beijing.)

目录 例子&#xff1a; 思路方法&#xff1a; ​编辑 &#xff08;分板块&#xff09;代码的实现&#xff1a; 一.字符串的获取&#xff08;3种简单的方法&#xff09; 1.用gets&#xff08;&#xff09;函数&#xff0c;即使中间有空格也会读取 2.用fgets&#xff08;&am…

RK3588平台开发系列讲解(项目篇)RKNN-Toolkit2 的使用

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、RKNN-Toolkit2安装二、模型转换和模型推理三、性能和内存评估沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 NPU 是专门用于神经网络的处理单元。它旨在加速人工智能领域的神经网络算法,如机器视觉和自…