【剑指offer - C++/Java】6、旋转数组的最小数字

题目链接:旋转数组的最小数字

文章目录

  • 1、题目描述
  • 2、题目分析
  • 3、代码
    • 3.1 Java代码
    • 3.2、C++代码
  • 4、总结

1、题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

2、题目分析

从头遍历到尾找到最小值这种low的方法就不说了,是个人都会!!!

旋转之后的数组实际上可以划分成两个有序的子数组:前面子数组的大小都大于后面子数组中的元素

注意到实际上最小的元素就是两个子数组的分界线。本题目给出的数组一定程度上是排序的,因此我们试着用二分查找法寻找这个最小的元素。如下图:
在这里插入图片描述

思路:

(1)我们用两个指针l_ndex,r_index分别指向数组的第一个元素和最后一个元素。按照题目的旋转的规则,第一个元素应该是大于最后一个元素的(没有重复的元素)。
但是如果不是旋转,第一个元素肯定小于最后一个元素。
在这里插入图片描述

(2)找到数组的中间元素。

如果中间元素大于第一个元素,则中间元素位于前面的递增子数组,此时最小元素位于中间元素的后面。我们可以让第一个指针l_index指向中间元素。
在这里插入图片描述
移动之后,第一个指针仍然位于前面的递增数组中。

如果中间元素小于第一个元素,则中间元素位于后面的递增子数组,此时最小元素位于中间元素的前面。我们可以让第二个指针right指向中间元素。

移动之后,第二个指针仍然位于后面的递增数组中。这样可以缩小寻找的范围。

比如当上图的情况,那么接下来的下一次循环过后,就是下图的样式:
在这里插入图片描述

(3)按照以上思路,第一个指针l_index总是指向前面递增数组的元素,第二个指针r_index总是指向后面递增的数组元素。

最终第一个指针将指向前面数组的最后一个元素,第二个指针指向后面数组中的第一个元素。

也就是说他们将指向两个相邻的元素,而第二个指针指向的刚好是最小的元素,这就是循环的结束条件。

特殊情况:

到目前为止以上思路很好的解决了没有重复数字的情况。如果有重复数字情况呢?

我们看一组例子:{1,0,1,1,1} 和 {1,1, 1,0,1} 都可以看成是非减排序的数组{0,1,1,1,1}的旋转。
在这里插入图片描述
这种情况下我们无法继续二分法,去解决这道题目。因为在这两个数组中,第一个数字,最后一个数字,中间数字都是1。

第一种情况下,中间数字位于后面的子数组(绿色),第二种情况,中间数字位于前面的子数组(紫色)。

因此当两个指针指向的数字和中间数字相同的时候,我们无法确定中间数字1是属于前面的子数组(紫色)还是属于后面的子数组(绿色)。

也就无法移动指针来缩小查找的范围。这时只能使用顺序查找法查找。

3、代码

3.1 Java代码

import java.util.ArrayList;
public class Solution {public int minNumberInRotateArray(int [] array) {int size = array.length;if(size==0)return 0;int l_index=0;int r_index=size-1;int m_index=-1;while(array[l_index]>=array[r_index]){if(r_index - l_index==1)break;//当只有两个数时,肯定是第二个数是最小数m_index=l_index+(r_index-l_index)/2;/* 如果左中右都相等,例如101111,则无法判断,只能按顺序查找 */if(array[l_index]==array[m_index] && array[m_index]==array[r_index])return MinInorder(array,l_index,r_index);if(array[m_index]>=array[l_index])l_index=m_index;else r_index=m_index;}return array[r_index];}/* 按顺序查找 */int MinInorder(int [] array ,int l,int r){int min=array[l];for(int i=l;i<=r;++i){if(array[i]<min)min=array[i];}return min;}
}

3.2、C++代码

class Solution {
public:int minNumberInRotateArray(vector<int> rotateArray) {int size = rotateArray.size();if(size == 0)return 0;int l_index = 0;int r_index = size - 1;int m_index = -1;while(rotateArray[l_index]>=rotateArray[r_index]){if(r_index - l_index == 1)break;m_index = l_index + (r_index-l_index)/2;/* 当左中右都相等时,例如101111,无法判断,只能顺序查找 */if(rotateArray[l_index]==rotateArray[m_index] && rotateArray[m_index]==rotateArray[r_index])return MinInorder(rotateArray,l_index,r_index);if(rotateArray[m_index]>=rotateArray[l_index])l_index = m_index;else if(rotateArray[m_index]<=rotateArray[r_index])r_index = m_index;}return rotateArray[r_index];}int MinInorder(vector<int> rotateArray, int index1, int index2){int Min = rotateArray[index1];for (int i = index1 + 1; i < index2; i++){if (rotateArray[i] < Min){Min = rotateArray[i];}}return Min;}
};

4、总结

注意二分查找的应用与特殊情况的考虑

探讨学习加:
qq:1126137994
微信:liu1126137994

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

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

相关文章

求一个有限长度字符串 最长的有序可重复字符串长度

求一个有限长度字符串 最长的有序可重复子串package acm;/*** author qxl*/ public class SequenceCharMax {/*** 输入一可重复的整数数组&#xff0c;求最长升序数组长度** 比如&#xff1a;* 输入&#xff1a;[1, 2, 3, 4]* 输出&#xff1a;4* 输入&#xff1a;[1, 5, 2, 3,…

发消息给非windows窗体程序

unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; var WM_SHUTDOWN_THREADS: Cardinal; //无符号32位 type TForm1 class(TForm) Button1: TButton; Button2: TButton; Memo1: TMem…

设计模式-责任链模型

责任链模式场景: OA审批系统 CEO 审批项目 经费 500万<x ≤\leq≤ 1000万总监 审批的经费 300万 < x ≤\leq≤ 500万总监秘书 审批的经费 100万< x ≤\leq≤ 300万研发经理 审批的经费 50万 <x ≤\leq≤ 100万 传统方式 是 (接收到请求后&#xff0c;根据相应金额&…

【OS学习笔记】三 计算机的启动过程

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 上一篇文章迈进了汇编的大门&#xff0c;点击链接查看上一篇文章&#xff1a;汇编语言和汇编软件 上一篇文章大概学会以下内容&#xff1a; 了解汇编…

sm115

sm115 sm115 for firefox 作者: clowwindy版本: 0.4安装地址: https://addons.mozilla.org/zh-CN/firefox/addon/235279/ 使用说明: Firefox安装本扩展后&#xff0c;115在高峰时段也会直接显示下载链接&#xff0c;不需要使用优蛋。 点击“继续提取”按钮&#xff0c;可以再…

从zip中读取文件 合并到指定的文件中

从zip中读取文件 合并到指定的文件中引入 commons-io 版本可以选择更高的版本 <dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version></dependency>具体代码如下&#xff1a;…

【OS学习笔记】四 什么是虚拟机

虚拟机是软件 对于第一次听说虚拟机&#xff08;Virtual Machine&#xff0c;VM&#xff09;的人来说&#xff0c;可能以为还要再花钱买一台计算机&#xff0c;这恐怕是他们最担心的。所谓虚拟机&#xff0c;就是在你的计算机上再虚拟出另一台计算机来。这台虚拟出来的计算机&…

TCP/IP协议族之运输层(TCP流量控制和拥塞控制 [1])

TCP的流量控制 1. 利用滑动窗口实现流量控制 如果发送方把数据发送得过快&#xff0c;接收方可能会来不及接收&#xff0c;这就会造成数据的丢失。所谓流量控制就是让发送方的发送速率不要太快&#xff0c;要让接收方来得及接收。 利用滑动窗口机制可以很方便地在TCP连接上实现…

英语词源记忆法

英语词源记忆法后续持续更新中

【OS学习笔记】五 VirtualBox的下载、安装和配置

上一篇文章学习了&#xff1a;计算机的启动过程&#xff08;点击链接查看上一篇文章&#xff09; 今天来接着上一篇文章&#xff0c;解决我们学习中的实验环境问题。 参考&#xff1a;X86汇编语言-从实模式到保护模式。作者李忠。纯学习笔记。如有侵权请联系我删除 1、下载O…

iframe透明

<iframe allowtransparency"true" src"A.html"></iframe> A.html body { background-color:transparent; } 转载于:https://www.cnblogs.com/mattins/archive/2010/10/13/1850098.html

spring体系思维导图

spring体系思维导图1. spring 思维导图2. springboot 思维导图3. springcloud 思维导图之前整理的&#xff0c;后续持续更新中1. spring 思维导图 2. springboot 思维导图 3. springcloud 思维导图

【数据结构与算法-java实现】一 复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?

今天开始学习程序的灵魂&#xff1a;数据结构与算法。 本文是自己学习极客时间专栏-数据结构与算法之美后的笔记总结。如有侵权请联系我删除文章。 我们都知道&#xff0c;数据结构和算法本身解决的是“快”和“省”的问题&#xff0c;即如何让代码运行得更快&#xff0c;如何…

sleep和wait的区别

考中2次了&#xff0c;再错第三次&#xff0c;我改姓&#xff01;天天笔试面试连轴转&#xff0c;查错的心情都没有&#xff01;不能再笨下去了&#xff01; from&#xff1a;http://nneverwei.javaeye.com/blog/494280 http://zhidao.baidu.com/question/75503928.html?frala…

idea模板

idea模板1.类注解模板2.方法注解模板3.自定义代码生成模板每次下载新版本的idea 或者换笔记本都需要重新&#xff0c;配置注解&#xff0c;而且从网上找了很多都或多或少有问题&#xff0c;每次要花费一些时间配置&#xff0c;这里整理一下。自定义代码生成模版&#xff0c;设置…

【OS学习笔记】六 实模式:编写主引导扇区代码

上一篇文章学习了&#xff1a;计算机的启动过程&#xff08;点击链接查看上一篇文章&#xff09; 这篇文章学习记录为&#xff1a;编写主引导扇区代码。 参考&#xff1a;《X86汇编语言-从实模式到保护模式》-李忠。纯学习笔记&#xff0c;更详细内容请阅读正版书籍。如有侵权…

秘罗地伤痕 -- 暂存小说草稿

六月的山城重庆热的让人发疯&#xff0c;远远看去&#xff0c;好像路上的青条石都要融化了似的。树梢也一动不动&#xff0c;似乎 在守卫着什么&#xff0c;坚定的站在自己的位置上。倒是走在这条路上的行人很是奇怪。这四个黑衣人&#xff0c;每人穿 一身高档礼服呢的西装&…

【OS学习笔记】七 Bochs的下载、安装和配置

参考&#xff1a;《X86汇编语言-从实模式到保护模式》-李忠。纯学习笔记&#xff0c;更详细内容请阅读正版书籍。 1 开源的BOCHS虚拟机软件 Bochs是开源软件。它用软件来模拟处理器取指令和执行指令的过程&#xff0c;以及整个计算机硬件。当它开始运行时&#xff0c;就直接模…

【OS学习笔记】八 实模式:编写主引导扇区代码-另一种更高效的写法

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 上一篇文章&#xff0c;我们用比较原始的方法编写了主引导扇区的代码。点击链接查看上一篇文章&#xff1a;编写主引导扇区代码 本片文章将学习以下内…