LeetCode 81. Search in Rotated Sorted Array II

简介: 假设按升序排序的数组在事先未知的某个枢轴处旋转。(例如, [0,0,1,2,2,5,6] 可能变成 [2,5,6,0,0,1,2]).给定一个要搜索的目标值T, 如果该目标值能在数组中找到则返回true,否则返回false。

v2-9449d0e2360124d3b66a67cff318f97b_1440w.jpg

Description



Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.


(i.e., [0,0,1,2,2,5,6] might become [2,5,6,0,0,1,2]).

You are given a target value to search. If found in the array return true, otherwise return false.


Example 1:

Input: nums = [2,5,6,0,0,1,2], target = 0

Output: true


Example 2:

Input: nums = [2,5,6,0,0,1,2], target = 3

Output: false


Follow up:

This is a follow up problem to Search in Rotated Sorted Array, where nums may contain duplicates.

Would this affect the run-time complexity? How and why?


描述



假设按升序排序的数组在事先未知的某个枢轴处旋转。

(例如, [0,0,1,2,2,5,6] 可能变成 [2,5,6,0,0,1,2]).

给定一个要搜索的目标值T, 如果该目标值能在数组中找到则返回true,否则返回false。


例1: 输入:nums = [2,5,6,0,0,1,2],target = 0 输出:true

例2:输入:nums = [2,5,6,0,0,1,2],target = 3 输出:false


跟进:

这是在旋转排序数组中搜索的后续问题,其中nums可能包含重复项。

这会影响运行时复杂性吗? 怎么样和为什么?


思路



  • 这一题和第33题思路很相似,是33题的递进题.
  • 这道题的变体是数组中可能出现重复元素.
  • 我们首先让left指向重复序列的最后一个元素,right指向重复序列的第一个元素.
  • 然后我们计算中间值索引middle,如果中间值nums[middle]==T返回Ture.
  • 如果中间值大于等于nums[left]:如果T在nums[left]与nums[middle]之间,我们更新right = middle-1;否则我们更新left = middle+1.
  • 如果中间值小于nums[right](由于上边取了等于,这里便可以不用再取等于):如果T在nums[middle]与nums[right]之间,我们更新left = middle+1;否则我们更新right = middle -1
  • 如果当left大于right时没有找到,我们返回False.


# -*- coding: utf-8 -*-
# @Author:             何睿
# @Create Date:        2018-12-23 11:15:08
# @Last Modified by:   何睿
# @Last Modified time: 2018-12-23 16:13:18
class Solution:
    def search(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: bool
        """
        if not nums:
            return False
        left, right, middle = 0, len(nums)-1, 0
        # 循环条件,只有当left小于等于right时,循环才执行
        while left <= right:
            # 从左边开始,找到连续相等的数字的最后一个值
            while left < right and nums[left] == nums[left+1]:
                left += 1
            # 从右边开始,找到连续相等的数字的第一个值
            while left < right and nums[right] == nums[right-1]:
                right -= 1
            # 取中间值
            middle = left+((right-left) >> 1)
            print(left, right, middle)
            # 如果中间值和要找的值相等,则返回Ture
            if nums[middle] == target:
                return True
            # 如果左边的数字是连续的
            elif nums[left] <= nums[middle]:
                # 如果target在连续的区间之内
                if nums[left] <= target < nums[middle]:
                    right = middle - 1
                else:
                    left = middle + 1
            # 如果右边的区间是连续的
            elif nums[middle] < nums[right]:
                # 如果target在连续的区间之内
                if nums[middle] < target <= nums[right]:
                    left = middle+1
                else:
                    right = middle-1
        return False
if __name__ == "__main__":
    so = Solution()
    res = so.search(nums=[3, 1], target=0)
    print(res)


源代码文件在这里.


目录
相关文章
Leetcode 74. Search a 2D Matrix
这道题很简单,为此专门写篇博客其实算博客凑数了。给你一个每一行每一列都是增序,且每一行第一个数都大于上一行末尾数的矩阵,让你判断某个数在这个矩阵中是否存在。 假设矩阵是m*n,扫一遍的时间复杂度就是O(m*n),题目中给出的这么特殊的矩阵,时间复杂度可以降到O(m+n),具体代码如下,写的比较挫。
91 1
Leetcode 4. Median of Two Sorted Arrays
题目描述很简单,就是找到两个有序数组合并后的中位数,要求时间复杂度O(log (m+n))。 如果不要去时间复杂度,很容易就想到了归并排序,归并排序的时间复杂度是O(m+n),空间复杂度也是O(m+n),不满足题目要求,其实我开始也不知道怎么做,后来看了别人的博客才知道有个二分法求两个有序数组中第k大数的方法。
41 0
Leetcode Find Minimum in Rotated Sorted Array 题解
对一个有序数组翻转, 就是随机取前K个数,移动到数组的后面,然后让你找出最小的那个数,注意,K有可能是0,也就是没有翻转。
54 0
Search in Rotated Sorted Array - 循环有序数组查找问题
Search in Rotated Sorted Array - 循环有序数组查找问题
73 0
LeetCode 167 Two Sum II - Input array is sorted(输入已排序数组,求其中两个数的和等于给定的数)
给定一个有序数组和一个目标值 找出数组中两个成员,两者之和为目标值,并顺序输出
89 0
LeetCode contest 200 5476. 找出数组游戏的赢家 Find the Winner of an Array Game
LeetCode contest 200 5476. 找出数组游戏的赢家 Find the Winner of an Array Game
|
算法 Python
LeetCode 108. 将有序数组转换为二叉搜索树 Convert Sorted Array to Binary Search Tree
LeetCode 108. 将有序数组转换为二叉搜索树 Convert Sorted Array to Binary Search Tree
|
17天前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
100 67
|
2月前
|
人工智能 前端开发 JavaScript
拿下奇怪的前端报错(一):报错信息是一个看不懂的数字数组Buffer(475) [Uint8Array],让AI大模型帮忙解析
本文介绍了前端开发中遇到的奇怪报错问题,特别是当错误信息不明确时的处理方法。作者分享了自己通过还原代码、试错等方式解决问题的经验,并以一个Vue3+TypeScript项目的构建失败为例,详细解析了如何从错误信息中定位问题,最终通过解读错误信息中的ASCII码找到了具体的错误文件。文章强调了基础知识的重要性,并鼓励读者遇到类似问题时不要慌张,耐心分析。
|
2月前
|
存储 Java
Java“(array) <X> Not Initialized” (数组未初始化)错误解决
在Java中,遇到“(array) &lt;X&gt; Not Initialized”(数组未初始化)错误时,表示数组变量已被声明但尚未初始化。解决方法是在使用数组之前,通过指定数组的大小和类型来初始化数组,例如:`int[] arr = new int[5];` 或 `String[] strArr = new String[10];`。
95 2