题目链接:leetcode33
题面
题目大意
做法和 153 比较类似,属于二分搜索某个值的问题。
解题思路
暴力
略
二分
153 那题是夹逼出一个最小值,也就是一定有答案。而本题不同,可能没有这个数,在二分结束的时候需要判定一下是否找到答案。
当然,做法类似,都是先确定 mid 所在的位置是在间断点的左边或者是右边,然后再根据各自的区间去划分。注意根据二分的写法对边界情况的判定。
代码实现
class Solution {
public:
int search(vector<int>& nums, int target) {
int l = 0, r = nums.size()-1, mid;
while (l < r) {
mid = l + (r - l >> 1);
if (nums[r] > nums[mid]) {
if (target <= nums[mid] || target > nums[r]) r = mid;
else l = mid + 1;
} else {
if (target > nums[mid] || target < nums[l]) l = mid + 1;
else r = mid;
}
}
return nums[l]==target?l:-1;
}
};