• Leetcode-33-Search in Rotated Sorted Array (Hard)


    二分查找算法以及旋转之后的数组二分查找算法:

    #!/usr/local/bin/python3
    # -*- coding: utf-8 -*-
    __author__ = 'author'
    
    
    class Solution(object):
        def search(self, nums, target):
            """
            :type nums: List[int]
            :type target: int
            :rtype: int
            """
            return self.sorted_binary_search(nums, 0, len(nums) - 1, target)
    
        #二分查找算法
        def binary_search(self, nums, start, end, targrt):
            if start > end:
                return -1
            mid = start + (end - start)//2
            if nums[mid] > targrt:
                return self.binary_search(nums, start, mid - 1, targrt)
            elif nums[mid] < targrt:
                return self.binary_search(nums, mid + 1, end, targrt)
            else:
                return mid
    
        #旋转数组的折半查找算法
        '''
        要解决这道题,需要明确rotated sorted array的特性,
        那么就是至少有一侧是排好序的(无论pivot在哪,自己画看看)。
        接下来就只需要按照这个特性继续写下去就好。
    
        如果target比A[mid]值要小
          如果A[mid]右边有序(A[mid]<A[high])
                那么target肯定不在右边(target比右边的都得小),在左边找
          如果A[mid]左边有序
                那么比较target和A[low],如果target比A[low]还要小,
                证明target不在这一区,去右边找;反之,左边找。
    
        如果target比A[mid]值要大
         如果A[mid]左边有序(A[mid]>A[low])
               那么target肯定不在左边(target比左边的都得大),在右边找
         如果A[mid]右边有序
               那么比较target和A[high],如果target比A[high]还要大,
               证明target不在这一区,去左边找;反之,右边找。
        '''
        def sorted_binary_search(self, nums, start, end, targrt):
            if start > end:
                return -1
            mid = start + (end - start)//2
            if targrt == nums[mid]:
                return mid
            if nums[start] <= nums[mid]:
                #如果左侧有序
                if nums[start] <= targrt and targrt <= nums[mid]:
                    #如果target在左侧中
                    return self.sorted_binary_search(nums, start, mid - 1, targrt)
                else:
                    return self.sorted_binary_search(nums, mid + 1, end, targrt)
            else:
                #如果右侧有序
                if nums[mid] <= targrt and targrt <= nums[end]:
                    #如果target在右侧中
                    return self.sorted_binary_search(nums, mid + 1, end, targrt)
                else:
                    return self.sorted_binary_search(nums, start, mid - 1, targrt)
    
    
    
    if __name__ == '__main__':
        s = Solution()
        print(s.binary_search([1,2,3,4,5,6,7,8,9], 0, 8, 9))
    

    代码中注释参考了:http://www.cnblogs.com/springfor/p/3858140.html , 该博客中的算法描述比较易懂

  • 相关阅读:
    js兼容性问题总结
    style设置/获取样式的问题 和 offsetWidth/offsetHeight的问题
    常用SQL总结
    完美运动框架,兼容性好,可多次调用
    JS—实现拖拽
    java设计模式——享元模式
    java设计模式——适配器模式
    java设计模式——装饰者模式
    java设计模式——外观模式(门面模式)
    java设计模式——单例模式(三)
  • 原文地址:https://www.cnblogs.com/doudouyoutang/p/6289437.html
Copyright © 2020-2023  润新知