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

  猿辅导在线教育二面中遇到的算法题:部分有序数组元素查找,把有序数组的一部分拿到前边,如 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
        }
        
    }
    
}
原文地址:https://www.cnblogs.com/duzhaoquan/p/14523589.html