猿辅导在线教育二面中遇到的算法题:部分有序数组元素查找,把有序数组的一部分拿到前边,如 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
}
}
}