1. 程式人生 > >leet33. 搜尋旋轉排序陣列

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