• 旋转数组查找


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

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

    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)) 
    
  • 相关阅读:
    使用keepalived实现双机热备
    MYSQL ERROR CODE 错误编号的意义
    Mysql slow query log
    eclipse svn 分支合并到主干
    Timer的schedule和scheduleAtFixedRate方法的区别解析
    Java内部类引用外部类中的局部变量为何必须是final问题解析
    nginx中有关命令和日志切割,配置文件加载的详细阐述
    流媒体中ffmpeg 命令的使用
    windows下搭建nginx服务器及实现nginx支持https配置流程
    mysql 中sql语句的执行顺序
  • 原文地址:https://www.cnblogs.com/bonelee/p/10229235.html
Copyright © 2020-2023  润新知