题目描述
假设一个升序数组以某个轴做了旋转,但轴的位置是未知的。
例如[0,1,2,4,5,6,7]
可能变为[4,5,6,7,0,1,2]
,在其中检索某个值是否存在。
数组中可能包含相同元素。
样例1
输入:nums = [2,5,6,0,0,1,2], target = 0
输出:true
样例2
输入:nums = [2,5,6,0,0,1,2], target = 3
输出:false
算法
(线性扫描) $O(n)$
这道题类似于Search in Rotated Sorted Array,不同点在于这道题里的数组可能包含相同元素。
目前能想到的二分做法的最坏时间复杂度都是 $O(n)$,所以索性就拿线性扫描做了^^。
时间复杂度分析:整个数组只扫描一遍,所以时间复杂度是 $O(n)$。
C++ 代码
class Solution {
public:
bool search(vector<int>& nums, int target) {
for (auto &v : nums)
if (v == target)
return true;
return false;
}
};
这是我在别的地方看到的二分题解,没有太搞懂为什么nums[mid] == nums[right]的时候,就是right – 。
如果相等的话,说明区间首尾的数可能一样,此时就不能二分了,只能缩小区间范围。
这个算法当所有数都相同的时候,时间复杂度是 $O(n)$的。
嗯嗯,我刚刚重新缕了一下思路,写了下该题二分的题解。感谢大佬回复。
棒!题解在哪呀,我去点赞
https://www.acwing.com/solution/LeetCode/content/2815/
虽然写的可能不太好,但是希望能不断进步,把自己理解的变成别人能容易理解的