zoukankan      html  css  js  c++  java
  • Leetcode 33. Search in Rotated Sorted Array

    Description: There is an integer array nums sorted in ascending order (with distinct values).

    Prior to being passed to your function, nums is rotated at an unknown pivot index k (0 <= k < nums.length) such that the resulting array is [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]] (0-indexed). For example, [0,1,2,4,5,6,7] might be rotated at pivot index 3 and become [4,5,6,7,0,1,2].

    Given the array nums after the rotation and an integer target, return the index of target if it is in nums, or -1 if it is not in nums.

    Link: 33. Search in Rotated Sorted Array

    Examples:

    Example 1:
    Input: nums = [4,5,6,7,0,1,2], target = 0
    Output: 4
    
    Example 2:
    Input: nums = [4,5,6,7,0,1,2], target = 3
    Output: -1
    
    Example 3:
    Input: nums = [1], target = 0
    Output: -1

    思路: 与平常的二分查找不同,有序list被折成两半了。二分查找的目的是确定目标值所在的区间,逐步缩小区间的大小,从而确定index的位置。我们会局限在以往的模式中,去比较nums[mid]和target的关系,但是这次需要考虑这一段区间是否有序,按照题解的思路:

    (1)如果target==A[m],那么m就是我们要的结果,直接返回;
    (2)如果A[m]<A[r],那么说明从m到r一定是有序的(没有受到rotate的影响),那么我们只需要判断target是不是在m到r之间,如果是则把左边缘移到m+1,否则就target在另一半,即把右边缘移到m-1。
    (3)如果A[m]>=A[r],那么说明从l到m一定是有序的,同样只需要判断target是否在这个范围内,相应的移动边缘即可。

    class Solution(object):
        def search(self, nums, target):
            """
            :type nums: List[int]
            :type target: int
            :rtype: int
            """
            if not nums: return -1
            n = len(nums)
            l, r = 0, n-1
            while l <= r:
                mid = int((l+r)/2)
                if target == nums[mid]:
                    return mid
                if nums[mid] < nums[r]:
                    if target > nums[mid] and target <= nums[r]:
                        l = mid+1
                    else:
                        r = mid-1
                else:
                    if target < nums[mid] and target >= nums[l]:
                        r = mid-1
                    else:
                        l = mid+1
            return -1

    日期: 2021-04-10 

  • 相关阅读:
    洛谷 P1763 状态压缩dp+容斥原理
    hdu4612 Warm up 缩点+树的直径
    UVA-315 无向图求割点个数
    mysql 严格模式 Strict Mode说明
    bak文件恢复成 SQL2005 数据库 的全程讲解
    vps(windows2003)安全设置参考
    window下lamp环境搭建
    centos虚拟机配置网卡连接
    linux Tar 命令参数详解
    linux 打包和压缩的概念和区别
  • 原文地址:https://www.cnblogs.com/wangyuxia/p/14641750.html
Copyright © 2011-2022 走看看