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),具体代码如下,写的比较挫。
138 1
Leetcode 4. Median of Two Sorted Arrays
题目描述很简单,就是找到两个有序数组合并后的中位数,要求时间复杂度O(log (m+n))。 如果不要去时间复杂度,很容易就想到了归并排序,归并排序的时间复杂度是O(m+n),空间复杂度也是O(m+n),不满足题目要求,其实我开始也不知道怎么做,后来看了别人的博客才知道有个二分法求两个有序数组中第k大数的方法。
83 0
Leetcode Find Minimum in Rotated Sorted Array 题解
对一个有序数组翻转, 就是随机取前K个数,移动到数组的后面,然后让你找出最小的那个数,注意,K有可能是0,也就是没有翻转。
114 0
Search in Rotated Sorted Array - 循环有序数组查找问题
Search in Rotated Sorted Array - 循环有序数组查找问题
156 0
LeetCode 167 Two Sum II - Input array is sorted(输入已排序数组,求其中两个数的和等于给定的数)
给定一个有序数组和一个目标值 找出数组中两个成员,两者之和为目标值,并顺序输出
131 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
|
3月前
|
测试技术 PHP 开发者
PHP 数组查找:为什么 `isset()` 比 `in_array()` 快得多?
PHP 数组查找:为什么 `isset()` 比 `in_array()` 快得多?
|
7月前
|
人工智能 Java
Java 中数组Array和列表List的转换
本文介绍了数组与列表之间的相互转换方法,主要包括三部分:1)使用`Collections.addAll()`方法将数组转为列表,适用于引用类型,效率较高;2)通过`new ArrayList&lt;&gt;()`构造器结合`Arrays.asList()`实现类似功能;3)利用JDK8的`Stream`流式计算,支持基本数据类型数组的转换。此外,还详细讲解了列表转数组的方法,如借助`Stream`实现不同类型数组间的转换,并附带代码示例与执行结果,帮助读者深入理解两种数据结构的互转技巧。
362 1
Java 中数组Array和列表List的转换
|
7月前
|
JavaScript 前端开发 API
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

热门文章

最新文章