1. 程式人生 > >【JS】搜尋旋轉排序陣列 II #陣列 #二分查詢

【JS】搜尋旋轉排序陣列 II #陣列 #二分查詢

假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。

( 例如,陣列 [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