leetcode 33搜索旋转排序数组(第二遍)
Posted Visitor
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode 33搜索旋转排序数组(第二遍)相关的知识,希望对你有一定的参考价值。
【题解】
如果没有旋转这么一说。
那么问题就是一道普通的二分查找的题目。
加上旋转之后。也没有让这个题变难多少。
问题的关键在于。
在二分查找的时候。
能够想到用nums[0]这个元素来确定当前二分枚举到的元素是在哪一个区间里面的。
即是在左边那个上升区间里面,还是在右边那个上升区间里面。
不过。
知道在哪个区间以后
还有一个问题。
就是我们不能单纯的就在那个区间里面做二分。
因为那个元素可能是在另外一个区间里的。
所以还得拿目标元素和nums[0]做一个对比。
比它小然后nums[mid]在左区间的话,直接l = mid+1
跑到右边那个区间去。
比它大的话然后nums[mid]在右边这个区间的话,直接r = mid-1,
跑到左边那个区间去。
这样才能不断逼近target的目标位置
总结
在写的时候,光想着判断nums[mid]在哪个区间。然后就在那个区间里面做二分了。
但是没有想到,其实target可能不在你做二分的那个区间里面的呀!
【代码】
class Solution {
public:
int search(vector<int>& nums, int target) {
int l = 0,r = (int)nums.size()-1;
while (l<=r){
int mid = (l+r)/2;
if (nums[0]<=nums[mid]){
if (nums[0]>target){
l = mid + 1;
}else{
if (target<nums[mid]){
r = mid - 1;
}else if (target>nums[mid]){
l = mid + 1;
}else return mid;
}
}else if (nums[0]>nums[mid]){
if (target>=nums[0]){
r = mid - 1;
}else{
if (target<nums[mid]){
r = mid - 1;
}else if (target>nums[mid]){
l = mid + 1;
}else return mid;
}
}
}
return -1;
}
};
以上是关于leetcode 33搜索旋转排序数组(第二遍)的主要内容,如果未能解决你的问题,请参考以下文章