leet33. 搜索旋转排序数组

题目:

假设按照升序排序的数组在预先未知的某个关键点上旋转。

(即 0 1 2 4 5 6 7 将变成 4 5 6 7 0 1 2)。

给你一个目标值来搜索,如果数组中存在这个数则返回它的索引,否则返回 -1。

你可以假设数组中不存在重复。

分析:

  1. 可以直接用库函数index(),时间复杂度O(n);
  2. 旋转的后果是列表不再是递增列表,但列表依然有序,可以通过分情况讨论采用二分法,时间复杂度O(lgn)

代码:

class Solution(object):
    def search(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        if not nums:
            return -1
        l = 0
        r = len(nums) - 1
        while l < r:
            if r - l == 1:
                if target in nums:
                    return nums.index(target)
                else:
                    return -1
            mid = (l + r) // 2
            # print "l:%d,mid:%d,r:%d"%(l,mid,r)
            if nums[mid] == target:
                return mid
            if target > nums[mid]:
                if nums[r] < nums[mid]:
                    l = mid + 1
                else:
                    if target > nums[r]:
                        r = mid -1
                    else:
                        l = mid + 1
            else:
                if nums[mid] > nums[l]:
                    if target < nums[l]:
                        l = mid + 1
                    else:
                        r = mid -1
                else:
                    r = mid - 1
        # print 'r:%d' % r
        if nums[r] == target:
            return r

        return -1

思考:

  1. 考虑特殊情况,列表长度为2的情况,直接采用遍历的方法,或使用index()库函数
  2. 代码优于leetcode中97%的case


猜你喜欢

转载自blog.csdn.net/yzp1011/article/details/79764486