假設按照升序排序的數組在預先未知的某個點上進行了旋轉。git
( 例如,數組 [0,1,2,4,5,6,7]
可能變爲 [4,5,6,7,0,1,2] )
。github
搜索一個給定的目標值,若是數組中存在這個目標值,則返回它的索引,不然返回 -1
。golang
你能夠假設數組中不存在重複的元素。面試
你的算法時間複雜度必須是 O(log n) 級別。算法
示例1:數組
輸入: nums = [4,5,6,7,0,1,2], target = 0 輸出: 4
示例2:數據結構
輸入: nums = [4,5,6,7,0,1,2], target = 3 輸出: -1
//1. 先二分遍歷找到分隔點index,特徵是 < 前一個元素, >後一個元素; //2. 把數組分紅二個部分,[0,index-1], [index,length-1]; //3. 分別使用二分查找,找到給定的值。 //時間複雜度爲log(n). 不肯定有什麼更好的辦法 func search(nums []int, target int) int { if len(nums) == 0 { return -1 } n := len(nums) - 1 divisionIndex := findDivision(nums) if divisionIndex == 0 || divisionIndex == -1 { //非旋轉排序數組 return findTarget(nums, 0, n, target) } res := findTarget(nums, 0, divisionIndex-1, target) if res != -1 { return res } return findTarget(nums, divisionIndex, n, target) } //找到分割點 func findDivision(nums []int) int { low, high := 0, len(nums)-1 for low < high { mid := low + (high-low)>>1 if nums[high] < nums[mid] { low = mid + 1 } else { high = mid } } return low } func findTarget(nums []int, low, high, target int) int { for low <= high { mid := low + (high-low)>>1 if nums[mid] > target { high = mid - 1 } else if nums[mid] < target { low = mid + 1 } else { return mid } } return -1 }
本文爲原創文章,轉載註明出處,歡迎掃碼關注公衆號
樓蘭
或者網站
https://lovecoding.club,第一時間看後續精彩文章,以爲好的話,順手分享到朋友圈吧,感謝支持。