【JS】搜尋旋轉排序陣列 II #陣列 #二分查詢
阿新 • • 發佈:2018-11-21
假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。
( 例如,陣列 [0,0,1,2,2,5,6] 可能變為 [2,5,6,0,0,1,2] )。
編寫一個函式來判斷給定的目標值是否存在於陣列中。若存在返回 true,否則返回 false。
示例 1:
輸入: nums = [2,5,6,0,0,1,2], target = 0
輸出: true
示例 2:
輸入: nums = [2,5,6,0,0,1,2], target = 3
輸出: false
進階:
這是 搜尋旋轉排序陣列 的延伸題目,本題中的 nums 可能包含重複元素。
這會影響到程式的時間複雜度嗎?會有怎樣的影響,為什麼?
解法一:
陣列是兩段升序構成的,所以先找到最大值 max 和最小值 min 確定目標值在哪一段,再給定那段陣列開始 lo 和結束 hi 的位置,
最後二分查詢
var search = function(nums, target) { var max = Math.max.apply(null,nums) var min = Math.min.apply(null,nums) var lo,hi,mid,len=nums.length if(target>nums[len-1]){ lo=0;hi=nums.indexOf(max) }else{ lo=nums.indexOf(min);hi=len-1 } // console.log(lo,hi) while(lo<=hi){ mid=Math.ceil((lo+hi)/2) if(nums[mid]==target) return true; if(nums[mid]>target){ hi=mid-1 }else{ lo=mid+1 } } return false; };
275 / 275 個通過測試用例
執行用時:72 ms