1. 程式人生 > >Leetcode篇:搜尋旋轉排序陣列

Leetcode篇:搜尋旋轉排序陣列


@author: ZZQ
@software: PyCharm
@file: search.py
@time: 2018/11/12 18:12
要求:假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。
( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。
搜尋一個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 -1 。
你可以假設陣列中不存在重複的元素。
你的演算法時間複雜度必須是 O(log n) 級別。
示例 1:
輸入: nums = [4,5,6,7,0,1,2], target = 0
輸出: 4

示例 2:
輸入: nums = [4,5,6,7,0,1,2], target = 3
輸出: -1
思路: 先找到陣列的旋轉位置,然後判斷該元素在旋轉的部分還是未旋轉的部分。

class Solution():
    def __init__(self):
        pass

    def search_index(self, target, nums, start, end):
        left = start
        right = end-1
        while left <= right:
            middle = (left + right) / 2
            if nums[middle] == target:
                return middle - start + 1
            elif nums[middle] < target:
                left = middle + 1
            else:
                right = middle - 1

        return -1

    def search(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        nums_len = len(nums)
        reverse_index = -1
        if nums_len == 0:
            return -1
        if nums_len == 1:
            if nums[0] == target:
                return 0
            else:
                return -1
        for i in range(nums_len-1):
            if nums[i] > nums[i+1]:
                reverse_index = i+1
        # 在旋轉後的子數組裡面
        if reverse_index != -1:
            if target < nums[0]:
                sub_index = self.search_index(target, nums, reverse_index, nums_len)
                if sub_index != -1:
                    index = reverse_index-1 + sub_index
                else:
                    index = -1
            else:
                sub_index = self.search_index(target, nums, 0, reverse_index+1)
                if sub_index != -1:
                    index = sub_index -1
                else:
                    index = -1
        else:
            sub_index = self.search_index(target, nums, 0, nums_len)
            if sub_index != -1:
                index = sub_index - 1
            else:
                index = -1
        return index