11.旋转数组的最小数字

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

题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。


例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。


解法一:


使用二分查找实现

c5aaa6083a4ed6abfcb2cb207a16cbfe_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hlZGEz,size_16,color_FFFFFF,t_70.png



分为两部分:前一个递增子数组 后一个递增子数组  ;两个指针分别指向第一个和最后一个;选择中间的位置元素比较它是属于第一个子数组还是第二个子数组(若是大于第一个元素则是属于第一个子数组,否则小于最后一个元素则是属于第二个子数组)


特殊情况:


三个元素都相同时,第一个 、中间 、最后一个

0f01f4ed3fccb5173f482b08ffe9b68e_20190131234759853.png


采用顺序查找实现。



class Solution {

public:

   int minNumberInRotateArray(vector<int> rotateArray) {

       int size = rotateArray.size();

       if(size == 0){

           return 0;

       }//if

       int left = 0,right = size - 1;

       int mid = 0;

       // rotateArray[left] >= rotateArray[right] 确保旋转

       while(rotateArray[left] >= rotateArray[right]){

           // 分界点

           if(right - left == 1){

               mid = right;

               break;

           }//if

           mid = left + (right - left) / 2;

           // rotateArray[left] rotateArray[right] rotateArray[mid]三者相等

           // 无法确定中间元素是属于前面还是后面的递增子数组

           // 只能顺序查找

           if(rotateArray[left] == rotateArray[right] && rotateArray[left] == rotateArray[mid]){

               return MinOrder(rotateArray,left,right);

           }//if

           // 中间元素位于前面的递增子数组

           // 此时最小元素位于中间元素的后面

           if(rotateArray[mid] >= rotateArray[left]){

               left = mid;

           }//if

           // 中间元素位于后面的递增子数组

           // 此时最小元素位于中间元素的前面

           else{

               right = mid;

           }//else

       }//while

       return rotateArray[mid];

   }

private:

   // 顺序寻找最小值

   int MinOrder(vector<int> &num,int left,int right){

       int result = num[left];

       for(int i = left + 1;i < right;++i){

           if(num[i] < result){

               result = num[i];

           }//if

       }//for

       return result;

   }

};

目录
相关文章
|
数据安全/隐私保护
BUUCTF 隐藏的钥匙 1
BUUCTF 隐藏的钥匙 1
222 0
|
计算机视觉 异构计算
【论文速递】ECCV2022 - ByteTrack:通过关联每个检测盒来进行多对象跟踪
【论文速递】ECCV2022 - ByteTrack:通过关联每个检测盒来进行多对象跟踪
|
5月前
|
前端开发 数据库
会议室管理系统源码(含数据库脚本)
会议室管理系统源码(含数据库脚本)
86 0
|
5月前
|
传感器 自然语言处理 监控
快速部署实现Bolt.diy
Bolt.diy 是 Bolt.new 的开源版本,提供灵活的自然语言交互与全栈开发支持。基于阿里云函数计算 FC 和百炼模型服务,最快5分钟完成部署。新手注册阿里云账号后可领取免费额度,按指引开通相关服务并授权。通过项目模板一键部署,配置 API-KEY 后即可使用。Bolt.diy 支持多种场景,如物联网原型开发、久坐提醒、语音控制灯光等,助力快速实现创意应用。
2386 22
|
移动开发 JavaScript 前端开发
如何使用 JavaScript 进行跨域请求?
如何使用 JavaScript 进行跨域请求?
|
11月前
|
消息中间件 前端开发 NoSQL
试用期被裁是有补偿的!一定要记得领取~
试用期被裁是有补偿的!一定要记得领取~
313 6
试用期被裁是有补偿的!一定要记得领取~
|
11月前
|
缓存 前端开发 JavaScript
阿里云CDN:怎么让网站变快
阿里云CDN:怎么让网站变快
|
弹性计算
阿里云服务器公网IP和私网IP地址在哪查询?
阿里云服务器公网IP和私网IP地址在哪查询?阿里云服务器IP地址在哪查看?在云服务器ECS管理控制台即可查看,阿里云服务器IP地址包括公网IP和私有IP,阿里云百科分享阿里云服务器IP地址查询方法
562 0
|
Java 数据库连接 Nacos
nacos配置管理拉取不到配置异常
在搭建Nacos配置时遇到异常,因配置了`file-extension: yaml`,服务尝试拉取`shared-jdbc.yaml`, `shared-log.yaml`, `shared-swagger.yaml`,但Nacos中这些共享配置的Data ID无后缀。修正方法是确保Data ID与预期文件名一致,包括.yaml扩展名。在验证中,修改了部分Data ID并导致服务因找不到未加后缀的`jdbc`配置而报错,提示在配置Data ID时应包含文件扩展名。
601 1