LeetCode 81.搜索旋转数组 II 题解
题目描述
已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。
在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 ,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,4,4,5,6,6,7] 在下标 5 处经旋转后可能变为 [4,5,6,6,7,0,1,2,4,4] 。
给你 旋转后 的数组 nums 和一个整数 target ,请你编写一个函数来判断给定的目标值是否存在于数组中。如果 nums 中存在这个目标值 target ,则返回 true ,否则返回 false 。
你必须尽可能减少整个操作步骤。
样例
1 | 输入:nums = [2,5,6,0,0,1,2], target = 0 |
1 | 输入:nums = [2,5,6,0,0,1,2], target = 3 |
算法1
(暴力枚举) $O(n)$
由于题目数据范围比较小,因此可以直接暴力枚举数组中每个元素,并于目标值进行比较即可
算法2
(二分查找) $O(log(n))$
这道题是 LeetCode 33.搜索旋转排序数组 的变种;
在 LC_33 中,数据保证了数组中不含有重复的元素,那么整个数组是具有二段性的,因此可以直接使用二分查找
在本题中,由于数组中含有重复元素,在旋转之后有可能会破坏原有的二分性质,因此需要在二分之前进行预处理,去掉某一部分中的重复元素,之后即可进行二分查找
如图所示,在二分时会出现无法判断属于前半部分还是后半部分的情况,因此需要对其中的一个部分删去重复元素,还原二分性质
C++ 代码
1 | class Solution { |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.