当前位置:网站首页>leetcode:153. 寻找旋转排序数组中的最小值
leetcode:153. 寻找旋转排序数组中的最小值
2022-08-03 02:04:00 【OceanStar的学习笔记】
题目来源
题目描述
题目解析
为了便于分析,我们先将数组中的数画在二维坐标系中,横坐标表示数组下标,纵坐标表示数组数值,如下所示:
我们发现:竖直虚线左边的数满足 nums[i]≥nums[0],而竖直虚线右边的数满足nums[i]< nums[0],分界点就是整个数组的最小值。数组具有二分性,所以我们可以二分出最小值的位置。
算法:
- 在[l,r]区间中, l = 0, r = nums.size() - 1,我们去二分<num[0]的最左边界。
- 当nums[mid] < nums[0]时,往左边区域找,r = mid。
- 当nums[mid] >= nums[0]时,往右边区域找,l = mid + 1。
- 当二分的范围缩小至一个数时,就是最小值的位置。
class Solution {
public:
int findMin(vector<int>& nums) {
int l = 0, r = nums.size() - 1;
if(nums[r] > nums[l]) return nums[0]; //升序数组,数组完全单调,第一个数最小
while(l < r)
{
int mid = (l + r)/2;
if(nums[mid] < nums[0]) r = mid;
else l = mid + 1;
}
return nums[r];
}
};
思路
class Solution {
public:
// 思路跟翻转数组一样,等分后的数组一定有一个是有序的,有序的数组取最左数为min,接着对之后的数组进行同样的操作。
int findMin(vector<int>& nums) {
int minVal = INT32_MAX;
int l = 0, r = nums.size() - 1;
while (l <= r) {
int m = l + (r - l) / 2;
int lv = nums[l], mv = nums[m], rv = nums[r];
if (lv == mv) {
// 只有2个数了, 初始1个也在其中
minVal = min(minVal, min(lv, rv));
break;
}
if (lv < mv) {
// 左半边有序
minVal = min(minVal, lv);
l = m + 1;
} else {
// 右半边有序
minVal = min(minVal, mv);
r = m - 1;
}
}
return minVal;
}
};
class Solution {
public:
int findMin(vector<int>& nums) {
int min = nums[0];
int left = 0, right = nums.size() -1;
while (left<=right){
int mid = (right-left)/2+left;
if (nums[mid]<nums[right]){
right = mid-1;
}else {
left = mid+1;
}
if (nums[mid]<min)
min = nums[mid];
}
return min;
}
};
思路:
只有三种情况
- 1.中间值大于两端,则说明最小值在右侧
- 2.中间值小于两端,则说明最小值在左侧
- 3.中间值介于两者之间,则说明此时已按顺序排列,最小值就是L
当LR相邻的时候就可以break了,此时LR中必定有一个是最小值
边栏推荐
- vsftp容器搭建+go开发web用户管理界面(更新于2022.02.23)
- DJI内推码(2022年8月2日更新)
- Topic Modeling of Short Texts: A Pseudo-Document View
- YYGH-BUG-06
- initramfs详解-----初识initramfs
- [Static type and dynamic type compile check and run check in Objective-C]
- qt opengl 使用不同的颜色绘制线框三角形
- HCIP第十二天_二层MPLS实验
- 【Flink】使用arthas在线诊断flink的那些事
- VS2010 组件列表与对应名称
猜你喜欢
The LVS load balancing cluster and the deployment of the LVS - NAT experiment
孩子坐不住就是不专注?猿辅导揭秘专注力的三大误区
超级复杂可贴图布局的初级智能文本提示器
【社媒营销】Facebook速推帖子如何运作?值得吗?
Violent recursion to dynamic programming 06 (the sword refers to Offer II 095. Longest common subsequence)
Jenkins2.328+sonarqube7.9 实现代码自动化检测
vs studio install opencv environment
EasyGBS播放器优化:设备通道视频播放出现跳屏问题的修复
5. Software testing ----- automated testing
服务器在线测速系统源码
随机推荐
如何准备考pmp?
Summary of some interviews
思维+启发式合并
常用工具链和虚拟环境-WSL
44LVS负载均衡群集-NAT
JVM内部结构图及各模块运行机制总结
HCIP第十二天_二层MPLS实验
在排列中求lcs
[@property enhancement in Objective-C language]
实现统一账号登录,sonarqube集成ldap
Guidelines for the use of SVA in UVM
Interconversion between numpy PIL tensors
自定义RunTimeException工具类
initramfs详解-----初识initramfs
Likou second week wrong questions collection
.NET in-depth analysis of the LINQ framework (four: IQueryable, IQueryProvider interface details)
sql注入是什么意思以及防止sql注入?
国标GB28181协议EasyGBS平台项目现场通知消息过多导致系统卡顿该如何解决?
pytorch 中 permute()函数的用法
征集 |《新程序员》专访“Apache之父”Brian Behlendorf,你最想问什么?