当前位置:网站首页>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;
}
};
边栏推荐
猜你喜欢
随机推荐
【开源项目】X-TRACK源码分析
JSP中page指令的import命令具有什么功能呢?
深度学习汇报(4)
MySQL读写分离与主从延迟
PyQt5安装配置(PyCharm) 亲测可用
houdini 求出曲线的法向 切线以及副法线
天地图给多边形加标注
pnpm的安装与使用
tf中tensor的大小输出
二分类和多分类
普林斯顿微积分读本03第二章--编程实现函数图像绘制、三角学回顾
【Flink 问题】Flink 如何提交轻量jar包 依赖该如何存放 会遇到哪些问题
C语言基础_共用体
Qt读取文件中内容(通过判断GBK UTF-8格式进行读取显示)
Scala类型转换
Codeforces Round #811 (Div. 3)无DF
LeetCode_2358_分组的最大数量
C Language Basics_Union
postman使用方法
js函数防抖和函数节流及其使用场景








![Detailed explanation of calculation commands in shell (expr, (()), $[], let, bc )](/img/3c/5cc4d16b9b525997761445f32802d5.png)
