• 旋转数组查找


    程序员面试金典里的解法才是正解,逻辑上没有漏洞,其他书籍的解法是有问题的:

    无论数组是否有相同数字。都可以使用下面解法:

    def search(arr, left, right, x):
        if left > right: return -1
        mid = (left+right)/2
        if x == mid:
            return mid
       
        # 你先看下最外围的三个if, 逻辑完备,>, <, = 都考虑到了!!!
        if arr[left] < arr[mid]:
            # 再看里面的if,都是在确定究竟哪一段有序
            if x>= arr[left] and x<arr[mid]:
                return search(arr, left, mid-1, x)
            else:
                return search(arr, mid+1, right, x)
        elif arr[mid] < arr[left]:
            if x>arr[mid] and x<=arr[right]:
                 return search(arr, mid+1, right, x)
            else:
                 return search(arr, left, mid-1, x)
         else:
             if arr[mid] == arr[right]: # 说明arr[mid]==arr[left]==arr[right],两边都有相等数据,只能两边继续二分
                  result = search(arr, left, mid-1, x)
                  if result == -1:
                      return search(arr, mid+1, right, x)
                  else:
                      return result
             else: # 说明 arr[mid]!=arr[right],仅left这边遇到相等
                 return search(arr, mid+1, right, x) 
    

    这段代码非常关键:

     else:
             if arr[mid] == arr[right]: # 说明arr[mid]==arr[left]==arr[right],两边都有相等数据,只能两边继续二分
                  result = search(arr, left, mid-1, x)
                  if result == -1:
                      return search(arr, mid+1, right, x)
                  else:
                      return result
             else: # 说明 arr[mid]!=arr[right],仅left这边遇到相等
                 return search(arr, mid+1, right, x) 

    同理,对于求解旋转数组最小值的解法:

    def get_min_of_rotation(arr, left, right):
        assert left <= right
        if left == right: return arr[left]
        mid = (left+right)/2
        if arr[mid] > arr[left]:
            return min(arr[left], get_min_of_rotation(arr, mid+1, right))        
        elif arr[mid] < arr[left]:
            return min(arr[mid], get_min_of_rotation(arr, left, mid-1))            
        else:
            if arr[mid] != arr[right]:
                return min(arr[mid], get_min_of_rotation(arr, mid+1, right))  
            else:
                return min(arr[mid], get_min_of_rotation(arr, mid+1, right), get_min_of_rotation(arr, left, mid-1)) 
    
  • 相关阅读:
    mysql关联更新like,CONCAT,Length 函数使用
    泛型类
    libwebp 解码 webp格式的图片或者动画【源码】
    windwos自带的 一个xml库 MSXML 兼容宽字符
    使用华为云的arm搭建gogs
    centos7 arm mysql 安装
    关于脱壳的一些笔记
    关于OD调试的一些笔记
    关于对《汇编语言》第3版 作者:王爽的阅读总结
    使用Proxifier + Fiddler 抓任何包
  • 原文地址:https://www.cnblogs.com/bonelee/p/10229235.html
Copyright © 2020-2023  润新知