Leetcode篇:搜索旋转排序数组

Posted 恩zzq我是

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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














以上是关于Leetcode篇:搜索旋转排序数组的主要内容,如果未能解决你的问题,请参考以下文章

搜索旋转排序数组[特殊二分]

搜索旋转排序数组[特殊二分]

LeetCode 81.搜索旋转排序数组 II

leetcode33 搜索旋转排序数组(Medium)

Leetcode 33.搜索旋转排序数组

LeetCode33. 搜索旋转排序数组