leetCode隨機刷題(四) ———— 山脈數組中查找目標值

  • 題目:

這是一個 交互式問題 )

給你一個 山脈數組 mountainArr,請你返回能夠使得 mountainArr.get(index) 等於 target 最小 的下標 index 值。

如果不存在這樣的下標 index,就請返回 -1。

何爲山脈數組?如果數組 A 是一個山脈數組的話,那它滿足如下條件:

首先,A.length >= 3

其次,在 0 < i < A.length - 1 條件下,存在 i 使得:

A[0] < A[1] < ... A[i-1] < A[i]
A[i] > A[i+1] > ... > A[A.length - 1]

你將 不能直接訪問該山脈數組,必須通過 MountainArray 接口來獲取數據:

MountainArray.get(k) - 會返回數組中索引爲k 的元素(下標從 0 開始)
MountainArray.length() - 會返回該數組的長度

  • 注意:

對 MountainArray.get 發起超過 100 次調用的提交將被視爲錯誤答案。此外,任何試圖規避判題系統的解決方案都將會導致比賽資格被取消。

爲了幫助大家更好地理解交互式問題,我們準備了一個樣例 “答案”:https://leetcode-cn.com/playground/RKhe3ave,請注意這 不是一個正確答案。

  • 示例:
輸入:array = [1,2,3,4,5,3,1], target = 3
輸出:2
解釋:3 在數組中出現了兩次,下標分別爲 2 和 5,我們返回最小的下標 2。
示例 2:

輸入:array = [0,1,2,4,2,1], target = 3
輸出:-1
解釋:3 在數組中沒有出現,返回 -1。

 

  • 我的解:
/**
 * // This is the MountainArray's API interface.
 * // You should not implement it, or speculate about its implementation
 * function MountainArray() {
 *     @param {number} index
 *     @return {number}
 *     this.get = function(index) {
 *         ...
 *     };
 *
 *     @return {number}
 *     this.length = function() {
 *         ...
 *     };
 * };
 */

/**
 * @param {number} target
 * @param {MountainArray} mountainArr
 * @return {number}
 */
var findInMountainArray = function(target, mountainArr) {
    var start = 0;
    var end = mountainArr.length()-1;
    var mid = start+Math.floor((end-start)/2);
    while(start<=end){
        if(mountainArr.get(mid)<=mountainArr.get(mid+1)) {
            start = mid + 1
        }else {
            end = mid - 1
        }
        mid = start+Math.floor((end-start)/2);
    }

    var index = -1
    index = binarySearch(mountainArr, target, 0, start, true)
    index == -1 ? index = binarySearch(mountainArr, target, start, mountainArr.length()-1, false) : ''
    return index
};
var binarySearch = function(mountainArr, target, start, end, isUp) {
    var mid = start + Math.floor((end-start)/2);
    while(start<=end){
        var midNum = mountainArr.get(mid)
        if(midNum == target) return mid;
        if(midNum < target) {
            isUp ? start = mid + 1 : end = mid - 1
        }else {
            isUp ? end = mid - 1 : start = mid + 1
        } 
        mid = start + Math.floor((end-start)/2);
    }
    return -1
}
  • 結果:

 

原題地址:https://leetcode-cn.com/problems/find-in-mountain-array/

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章