当前位置:网站首页>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中必定有一个是最小值
边栏推荐
- 44LVS负载均衡群集-NAT
- Incorrect datetime value: '2022-01-01' for function str_to_date
- 扩展卡尔曼滤波【转】
- apache-activemq-5.14.1
- sql注入是什么意思以及防止sql注入?
- 南瓜科学新品上线 开辟益智玩具新世界
- 禁用token及无感知更新token功能实现
- The cornerstone of high concurrency: multithreading, daemon threading, thread safety, thread synchronization, mutual exclusion lock, all in one article!...
- 能添加任意贴图超级复布局的初级智能文本提示器
- 【Swoole系列3.3】单进程管理Process
猜你喜欢

YYGH-BUG-06

radio button、qss文件环境配置

Topic Modeling of Short Texts: A Pseudo-Document View

qt opengl 使用不同的颜色绘制线框三角形

超级复杂可贴图布局的初级智能文本提示器

【Swoole系列3.3】单进程管理Process

lombok 下的@Builder和@EqualsAndHashCode(callSuper = true)注解

怎么从零编写一个 v3 版本的 chrome 浏览器插件实现 CSDN 博客网站的暗黑和明亮主题切换?

南瓜科学新品上线 开辟益智玩具新世界

LVS负载均衡群集及部署LVS-NAT实验
随机推荐
LabVIEW程序框图保存为图像
FLIR E95 在8层楼看马路上行驶的CAR的热成像形态?
kubernetes部署ldap
45部署LVS-DR群集
南瓜科学新品上线 开辟益智玩具新世界
面试题整理1
[Arduino] Reborn Arduino Monk (2)----Arduino Language
initramfs详解----设备文件系统
【Flink】如何生成 Flink 作业的交互式火焰图?
【Arduino】重生之Arduino 学僧(2)----Arduino语言
【社媒营销】Facebook速推帖子如何运作?值得吗?
visual studio 2012 为啥这么优秀
initramfs详解-----初识initramfs
LVS负载均衡群集及部署LVS-NAT实验
The Sandbox 市场平台将上线 Isla Obscura 第五期 NFT 作品集
梅科尔工作室-14天华为培训三
QT添加资源文件、样式表、qss文件使用
44LVS负载均衡群集-NAT
会话技术!
10大领域5大过程47子过程快速记忆