• 算法:部分有序数组元素查找


      猿辅导在线教育二面中遇到的算法题:部分有序数组元素查找,把有序数组的一部分拿到前边,如 6 7 8 9 1 2 3 4 5,

      查找某元素是否在在数组中返回位置,要求时间复杂度不能大于O(n)

             使用二分查找

             问题的关键在于找到最大值所在位置

             属于前半部分就在前半部分二分查找,否则在后半部分二分查找

    func search(arr:[Int],value :Int) -> Int?{
        let maxIndex = searchMaxOption(arr: arr)
        if value > arr[maxIndex] || value < arr[maxIndex + 1]{
            return nil
        }else if value >= arr[0] && value <= arr[maxIndex]{
            return binearSearch(arr: arr, start: 0, end: maxIndex, value: value)
        }else if value >= arr[maxIndex + 1] && value <= arr[arr.count - 1]{
            return binearSearch(arr: arr, start: maxIndex + 1, end: arr.count - 1, value: value)
        }
        return nil
    }
    //二分查找
    func binearSearch(arr:[Int],start:Int,end:Int,value:Int) -> Int{
        
        var s = start,e = end ,m = 0
        
        while s < e {
            m = (s + e)/2
            if arr[m] == value{
                return m
            }else if arr[m] < value{
                s = m + 1
            }else if arr[m] > value{
                e = m - 1
            }
        }
        
        return -1
    }
    //查找最大位置
    func searchMaxOption(arr:[Int]) -> Int{
        var start = 0
        var end = arr.count - 1
        var middel = 0
        while true {
            middel = (start + end)/2
            if arr[middel] > arr[start]{
                start = middel
            }else if arr[middel] < arr[end]{
                end = middel
            }else{
                return start
            }
            
        }
        
    }
  • 相关阅读:
    TensorFlow学习笔记--CIFAR-10 图像识别
    第二章--第二节:注释
    webbrowser
    RichViewEdit
    RichEdit
    TreeView
    RichView
    ListView
    DesktopLoader服务程序
    Delphi实现程序只运行一次并激活已打开的程序
  • 原文地址:https://www.cnblogs.com/duzhaoquan/p/14523589.html
Copyright © 2020-2023  润新知