搜索旋转排序数组
问题:
整数数组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,5,6,7]
在下标 3 处经旋转后可能变为[4,5,6,7,0,1,2]
。
给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回
-1
。
思路:
法一:局部二分查找法。
法二:直接查找法。
// 局部二分查找法
class Solution {
public:
int search(vector<int>& nums, int target) const {
auto n = nums.size();
if(!n) return -1;
if(n == 1) return nums[0] == target ? 0 : -1;
auto l = 0;
auto r = n - 1;
while (l <= r) { // 开始二分查找
int mid = (l + r) / 2;
if (nums[mid] == target) return mid;
if (nums[0] <= nums[mid]) { // 左边有序
if (nums[0] <= target && target < nums[mid]) {
r = mid - 1;
} else {
l = mid + 1;
}
} else { // 右边有序
if (nums[mid] < target && target <= nums[n - 1]) {
l = mid + 1;
} else {
r = mid - 1;
}
}
}
return -1;
}
};
- 时间复杂度:O(log(n))
- 空间复杂度:O(1)
// 直接查找法
class Solution {
public:
int search(vector<int>& nums, int target) const {
if(!nums.size()) return -1;
auto i = 0;
for(auto& n : nums) {
if(target == n) return i;
else i++;
}
return -1;
}
};
- 时间复杂度:O(n)
- 空间复杂度:O(1)