当前位置:网站首页>leetcode:81. 搜索旋转排序数组 II
leetcode:81. 搜索旋转排序数组 II
2022-08-02 08:49:00 【OceanStar的学习笔记】
题目来源
题目描述
class Solution {
public:
bool search(vector<int>& nums, int target) {
}
};
题目解析
本题是leetcode:33. 搜索旋转排序数组的扩展,区别在于本题有重复元素。
我们知道,所谓的旋转其实就是「将某个下标前面的所有数整体移到后面,使得数组从整体有序变为分段有序」。
本题元素不唯一,这意味着我们无法直接根据nums[0]的大小关系,将数组分为为两段,即无法通过「二分」来找到旋转点。
因为「二分」的本质是二段性,并非单调性。只要一段满足某个性质,另外一段不满足某个性质,就可以用「二分」。
举个,我们使用数据 [0,1,2,2,2,3,4,5] 来理解为什么不同的旋转点会导致「二段性丢失」:
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
while (left <= right){
int mid = left + (right - left) / 2;
if(nums[mid] == target){
return true;
}
if(nums[left] == nums[mid]){
left++;
continue; // 跳到下个left
}
if (nums[left] <= nums[mid]) {
// 左侧有序,这里可不用=,因为上面判断了
if (nums[left] <= target && target < nums[mid]) {
// 是否在左侧
right = mid - 1;
} else {
// 否则在右边
left = mid + 1;
}
} else {
// 右侧有序
if (nums[mid] < target && target <= nums[right]) {
// 是否在右侧
left = mid + 1;
} else {
// 否则在在左边
right = mid - 1;
}
}
}
return false;
}
};
边栏推荐
猜你喜欢
随机推荐
Qt读取文件中内容(通过判断GBK UTF-8格式进行读取显示)
USACO美国信息学奥赛竞赛12月份开赛,中国学生备赛指南
How Engineers Treat Open Source --- A veteran engineer's heartfelt words
Ansible learning summary (11) - detailed explanation of forks and serial parameters of task parallel execution
膜拜,Alibaba分布式系统开发与核心原理解析手册
Scala类型转换
三维体尺测量
Flink 监控指南 被动拉取 Rest API
(Note) AXIS ACASIS DT-3608 Dual-bay Hard Disk Array Box RAID Setting
sql concat(),如何才能拼接表的名字
js引擎运行中的预解析(变量提升和函数提升)及相关实操案例
Mysql Mac版下载安装教程
The custom table form
动态规划每日一练(3)
HCIP笔记十六天
uvm-phase机制
了解下C# 不安全代码
【C】关于柔性数组.简要的谈谈柔性数组
TiFlash 存储层概览
MySQL ODBC驱动简介