一句话总结解题思路:带有特殊技巧的“二分查找”
- 题意理解:
所谓旋转数组,通俗来讲就是以数组中某下标k为界,将从k到数组尾的所有元素全部提前。现在我们的目标是找到 target 在数组中的位置,时间复杂度相对较低的算法当然还是二分查找啦。可是,我们以往的二分查找都是建立在数组有序排列的基础上,显然本题给出的数组 nums 不满足条件。但由于部分元素间保持了有序的状态,所以,利用好它们之间的升序关系是解决本题的关键。
- 代码实现:
class Solution {
public:
int search(vector<int>& nums, int target) {
int i=0;
int j=nums.size()-1;
int res=-1;
while(i<=j){
int mid=i+(j-i)/2;
if(nums[mid]==target){
res=mid;
break;
}
if(nums[mid]>nums[j]){
if(target>=nums[i]&&target<nums[mid])
j=mid-1;
else
i=mid+1;
}
else{
if(target<=nums[j]&&target>nums[mid])
i=mid+1;
else
j=mid-1;
}
}
return res;
}
};
- 代码解析:
代码中最难理解的部分就是while循环里的内容。nums[mid]==target 就不用多说了,找到满足要求的index,直接 break ;当 nums[mid]>nums[j] 说明此时 mid右边元素乱序,左边升序。此时再将 target 与左边部分的上界下界进行比较,即 nums[i] 与 nums[mid] ,如果在此区间内,我们就可以进一步锁定查找范围,置 j=mid-1;同理,mid左边乱序,右边升序亦是如此。
- 一些tips:
①哈哈哈其实这道题用for循环效果还挺好的,不过做题重在锻炼思维嘛,没错,我就要与自己为难😕。
②二分查找其实不是很难,while循环罢辽~,就是有的时候会变变花样,结合思维上的技巧来出题。
哇哇哇第三篇啦,大家都要加油嗷💪