zoukankan      html  css  js  c++  java
  • Leetcode题库——33.搜索旋转排序数组


    @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
    
  • 相关阅读:
    Hive学习之路 (十二)Hive SQL练习之影评案例
    Hive学习之路 (十一)Hive的5个面试题
    Guava Files 源码分析(二)
    Guava Files 源码分析(一)
    观察者模式与Guava EventBus
    Guava 源码分析之 Beta, GwtCompatible, GwtIncompatible, Charset, HashCode
    Java IO的简单示例
    从volatile说到i++的线程安全问题
    乐观锁与悲观锁
    SimpleDateFormat的线程安全问题与解决方案
  • 原文地址:https://www.cnblogs.com/zzq-123456/p/9965429.html
Copyright © 2011-2022 走看看