题目描述
这一题可以先二分找到最小值的位置,再根据target的值来确定区间在前一半还是后一半。再用一次二分查找。
C++ 代码
class Solution {
public:
int search(vector<int>& nums, int target) {
if (nums.empty()) return -1;
int l = 0, r = nums.size() - 1;
if (nums[0] > nums.back()) { //如果是翻转的,找到最最小值得位置。
while (l < r) {
int mid = l + r >> 1;
if (nums[mid] < nums[r]) r = mid;
else l = mid + 1;
}
if (target >= nums[0]) r = l, l = 0;//确定目标值在,前一半区间。
else l = l, r = nums.size() - 1;//后一半区间
}
while (l < r) {
int mid = l + r >> 1;
if (nums[mid] >= target) r = mid;
else l = mid + 1;
}
if (nums[l] == target) return l;
return -1;
}
};
这个思路巧妙啊,旋转后的排序数组必然是两段递增的序列, 所以先找到最小点把两端序列找出来,然后在判断目标可能在哪一段,然后再进行二分~
在前一半区间,为什么 r 不应该等于 l-1 嘛
在leetcode上试了一下,r = l 和 r = l-1 都能过,但是 r = l 的话是不是导致搜索的空间不是完全增序的(因为l位是最小的),
思路很简洁,不错!