zoukankan      html  css  js  c++  java
  • 算法:部分有序数组元素查找

      猿辅导在线教育二面中遇到的算法题:部分有序数组元素查找,把有序数组的一部分拿到前边,如 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
            }
            
        }
        
    }
  • 相关阅读:
    Linux中查找当前目录下占用空间最大的前10个文件
    Redis的优势和特点
    java中final,finally,finalize三个关键字的区别
    消息队列介绍
    Redis的应用场景
    Spring中@Autowired注解与@Resource注解的区别
    多版本并发控制(MVCC)
    Linux查看CPU和内存使用情况
    进程调度算法
    一致性Hash算法
  • 原文地址:https://www.cnblogs.com/duzhaoquan/p/14523589.html
Copyright © 2011-2022 走看看