每日一题20201126*(33. 搜索旋转排序数组)

简介: 搜索旋转排序数组

33. 搜索旋转排序数组

14.jpg

image-20201202152424398

思路


  • 二分法
    先对着代码进行讲解。


class Solution:
    def search(self, nums: List[int], target: int) -> int:
        # low和high分别指向数组2端
        low, high = 0, len(nums)-1
        while low <= high:
            mid = (low+high) // 2
            # 如果nums[mid]与目标相等,直接return,这里没有异议
            if nums[mid] == target:
                return mid
            elif nums[mid] > target:
                # 这里开始出现分歧,虽然中位数大于了目标,由于存在
                # 旋转的可能,如果低位也大于目标且低位到中位是递增的
                # 那么可以肯定左半段没有等于target的数了,所以往右侧找
                if nums[low] > target and nums[low] <= nums[mid]:
                    low = mid+1
                # 否则与正常二分保持一致
                else:
                    high = mid-1
            else:
                # 同上
                if nums[high] < target and nums[high] >= nums[mid]:
                    high = mid - 1
                else:
                    low = mid + 1
        return -1


虽然这个数组是被旋转了,但是也满足二分搜索条件,只不过需要做一定的转换。
我们来看下面这个例子: [5, 1, 3] 当目标元素是5的时候,首先二分会找到1,按照以往的数组,这时候low应该等于mid+1,但在这里不一样,因为数组有可能已经被旋转了。
所以需要往左侧走,high = mid-1,当然这个也是有条件的,那就是此时nums[high]也比target小,并且nums[high]要保证大于nums[mid],也就是说后半段要是递增的,那就肯定没有数字比target大了,这时候才会去左边查找。
同理当target比nums[mid]小的时候也是一样。

15.jpg

image-20201202153406536


里面还是有许多坑的,比如递增的条件一定要≥,否则有部分用例会发现你的bug。
大家写完之后可以多写点特殊场景的用例自测一下再提交,通过的概率会大很多!




相关文章
|
vr&ar
leetcode每日一题 2021/4/7 81. 搜索旋转排序数组 II
leetcode每日一题 2021/4/7 81. 搜索旋转排序数组 II
42 0
|
3月前
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
26 0
Leetcode第三十三题(搜索旋转排序数组)
|
5月前
|
算法
LeetCode第81题搜索旋转排序数组 II
文章讲解了LeetCode第81题"搜索旋转排序数组 II"的解法,通过二分查找算法并加入去重逻辑来解决在旋转且含有重复元素的数组中搜索特定值的问题。
LeetCode第81题搜索旋转排序数组 II
|
5月前
|
算法
LeetCode第33题搜索旋转排序数组
这篇文章介绍了LeetCode第33题"搜索旋转排序数组"的解题方法,通过使用二分查找法并根据数组的有序性质调整搜索范围,实现了时间复杂度为O(log n)的高效搜索算法。
LeetCode第33题搜索旋转排序数组
|
7月前
|
存储 算法 数据挖掘
LeetCode 题目 81:搜索旋转排序数组 II
LeetCode 题目 81:搜索旋转排序数组 II
|
算法 安全 Swift
LeetCode - #33 搜索旋转排序数组(Top 100)
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
|
算法
每日一题——搜索插入位置(二分查找)
每日一题——搜索插入位置(二分查找)
leetcode 33 搜索旋转排序数组
leetcode 33 搜索旋转排序数组
103 0
leetcode 33 搜索旋转排序数组