力扣leetcode二分题33. 搜索旋转排序数组详细分析
Posted Afololer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣leetcode二分题33. 搜索旋转排序数组详细分析相关的知识,希望对你有一定的参考价值。
题目
https://leetcode-cn.com/problems/search-in-rotated-sorted-array/submissions/
思考
往左边走还是往右边走?
猜想与mid与左右两端的关系有关,target与左右两端的关系有关
下面分情况讨论
mid指标的值比target要大
正常情况下,往左边寻找,然而经过了旋转,左边的小值可能旋转到右边
正常 [1,2,3,4,5,6,7]
旋转1 [2,3,4,5,6,7,1]
旋转2 [7,1,2,3,4,5,6]
显然,当mid比最右值小时,本次旋转为旋转2,只可能往左边走
那么假如mid比最右值大呢?
说明左边的小数旋转到了右边,此时mid左边的值必都比mid小,如果最左都比target大,那么只能往右边走,否则往左边走
mid指标的值比target要小
显然,当mid比最右值大时,本次旋转为旋转1,只可能往右边走
那么假如mid比最右值小呢?
根据以上分析,尝试情况都取反
说明右边的大数旋转到了左边,此时mid右边的值必都比mid大,如果最右都比target小,那么只能往左边走,否则往右边走
总结
if(nums[mid]<target)
if nums[mid]<nums[high]
high = mid-1;
else
if nums[low]>target
low = mid+1;
else
high = mid-1;
else
if nums[mid]>nums[low]
low = mid+1;
else
if nums[high]<target
high = mid-1;
else
low = mid+1;
代码
public int search(int[] nums, int target)
int len = nums.length;
int low =0;
int high = len-1;
int mid;
while(low<=high)
mid = low+(high-low)/2;
System.out.print(low);
System.out.println(high);
if(nums[mid]==target)
return mid;
if(nums[mid]>target)
if(nums[mid]<nums[high])
high =mid-1;
else
if(target<nums[low])
low = mid+1;
else
high= mid-1;
else
if(nums[mid]>nums[high])
low =mid+1;
else
if(target>nums[high])
high= mid-1;
else
low = mid+1;
return -1;
以上是关于力扣leetcode二分题33. 搜索旋转排序数组详细分析的主要内容,如果未能解决你的问题,请参考以下文章
精选力扣500题 第15题 LeetCode 33. 搜索旋转排序数组c++详细题解