leetcode33. Search in Rotated Sorted Array

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

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

You are given a target value to search. If found in the array return its index, otherwise return -1.

You may assume no duplicate exists in the array.

Your algorithm's runtime complexity must be in the order of O(log n).

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

 

大意原有一个排序好的严格单调增整数序列,将其旋转,

也就是说旋转以后的序列可能是一段增序列,也有可能是由两段增序列组成,并且第二段序列中的任意数字小于第一段序列中的任意数字

然后在那之中找到目标数的索引,找不到就返回-1,要求时间复杂度是O(log n)

初步的想法是

1,先找到转折点,所谓转折点就是第一段序列的最后一个数字,O(log n)复杂度,类似于二分查找

2,从而确定target所在的递增序列,

3, 寻找符合的数字,logn复杂度,

这样做下来时间复杂度是没有问题的,就是所花时间太长了,然后借鉴了别人的代码,自己写了一下

class Solution:
    def search(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        m, n = 0, len(nums)-1
        while(m<=n):
            mid = (m+n)//2
            if nums[mid] == target:
                return mid
            #这个地方要注意界限的判断因为mid是可以=m的
            #mid位于前半段
            if nums[mid] >= nums[m]:
                #因为m-mid是递增的判断target是否处于该范围
                if target < nums[mid] and target >= nums[m]:
                    n = mid - 1
                else:
                    m = mid + 1
            #位于后半段
            else:
                #因为mid-n是递增的判断target是否处于该范围
                if target > nums[mid] and target <= nums[n]:
                    m = mid + 1
                else:
                    n = mid - 1
        return -1

二分查找的变种,尤其要注意的就是边界的问题,

posted @ 2018-12-04 18:05  茫茫碧落  阅读(126)  评论(0编辑  收藏  举报