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