2020.4.27搜索旋转排序数组
题目呈现如下:
题目传送门
思路介绍:
- 首先,题目要求复杂度在(O(log_{2}n))一下,可以预见必定要利用搜索旋转排序数组部分有序的特点,采用基于二分检索的检索方法.
- 接下来主要的难题在于如何在搜索的某个状态,确定往前走还是往后走.实质上我们考虑的并不是左边界和有边界,我们的关注点只在--mid,亦即二分搜索每次拿来与Key对比的元素.边界的往哪个方向缩是很顺其自然的事情.我们可以列举一下可能出现的所有情况,然后据此确定往哪里缩.
形象化的思路如图:
下附AC代码
class Solution {
public:
int search(vector<int>& nums, int target) {
if(!nums.size()) return -1; // 注意,没有标程里面默认非空的条件
int l = 0, r = nums.size()-1; // 左边界和右边界
while (l < r) {
int mid = (l + r)/2;
if ((nums[0] > target) ^ (nums[0] > nums[mid]) ^ (target > nums[mid])) // 这个参照题解而来,和上述思路大差不差,其亦或优化实在惊艳
else
r = mid;
}
return nums[r] == target ? r : -1; // 这地方是r=l的,r和l都可以
}
};