力扣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. 搜索旋转排序数组详细分析的主要内容,如果未能解决你的问题,请参考以下文章

力扣leetcode二分题33. 搜索旋转排序数组详细分析

精选力扣500题 第15题 LeetCode 33. 搜索旋转排序数组c++详细题解

二分查找团灭力扣旋转排序数组系列

精选力扣500题 第17题 LeetCode 33. 搜索旋转排序数组c++详细题解

Leetcode33. 搜索旋转排序数组(两次二分)

力扣 33. 搜索旋转排序数组 [二分]