zoukankan      html  css  js  c++  java
  • 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 , 该博客中的算法描述比较易懂

  • 相关阅读:
    排序算法之归并排序(Merge Sort)
    排序算法之选择排序
    [BUUCTF]REVERSE——firmware
    [BUUCTF]REVERSE——[WUSTCTF2020]Cr0ssfun
    [BUUCTF]PWN——hitcontraining_magicheap
    [BUUCTF]PWN——ciscn_2019_n_3
    [BUUCTF]PWN——[V&N2020 公开赛]easyTHeap
    [BUUCTF]PWN——babyfengshui_33c3_2016
    [BUUCTF]PWN——babyheap_0ctf_2017
    CTFHub[PWN技能树]——栈溢出
  • 原文地址:https://www.cnblogs.com/doudouyoutang/p/6289437.html
Copyright © 2011-2022 走看看