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

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

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

( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。

搜尋一個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 -1 。

你可以假設陣列中不存在重複的元素。

你的演算法時間複雜度必須是 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

示例 3:
輸入: nums = [3,1], target = 1
輸出: 1

示例 4:
輸入: nums = [3,1], target = 3
輸出: 0



解法一:

使用了 indexOf() 函式,定位最小數 min 和最大數 max
與目標值 target 對比大小確定 開始 lo 和結束 hi 的位置,
最後二分查詢

// 2018/11/21 Web 上午

var search = function(nums, target) {
    var min=Math.min.apply(null,nums)
    var max=Math.max.apply(null,nums)
    var pos,lo,hi,mid,len=nums.length

    if(target>nums[len-1] ){
        pos = nums.indexOf(max)
        lo = 0;hi = pos
    }else{
        pos = nums.indexOf(min)
        lo=pos;hi=len-1
    }
    // console.log(lo,hi)
    while(lo<=hi){
        mid = Math.ceil((lo+hi)/2);
        if(nums[mid] == target) return mid;
        if(nums[mid] < target){
            lo = mid+1
        }else{
            hi = mid-1
        }
    }
    return -1;
};

196 / 196 個通過測試用例
執行用時:80 ms