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

  猿辅导在线教育二面中遇到的算法题:部分有序数组元素查找,把有序数组的一部分拿到前边,如 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
        }
        
    }
    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值