1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
var findInMountainArray = function(target, mountainArr) { let length = mountainArr.length(); let left_v = mountainArr.get(0); let right_v = mountainArr.get(length - 1); if (target < left_v && target < right_v) { return -1 } let resMid = findTop(0, length - 1, mountainArr) let top = resMid.mid; let topV = resMid.mid_v; if (target > topV) { return -1; } let left_target = findLeftTarget(0, top, mountainArr, target); return left_target === -1 ? findRightTarget(top, length-1, mountainArr, target) : left_target; }; var findTop = function(left, right, mountainArr) { let mid = left + ((right - left) >> 1); let mid_lv = mountainArr.get(mid - 1); let mid_v = mountainArr.get(mid); let mid_rv = mountainArr.get(mid + 1); if (mid_v > mid_lv) { if (mid_v > mid_rv) { return { mid: mid, mid_v: mid_v, } } else { return findTop(mid, right, mountainArr) } } else if (mid_v < mid_lv) { return findTop(left, mid, mountainArr) } } var findLeftTarget = function(left, right, mountainArr, target) { if (right - left <= 1) { let left_v = mountainArr.get(left); if (left_v === target) { return left; } let right_v = mountainArr.get(right); if (right_v === target) { return right; } return -1 } let mid = left + ((right - left) >> 1); let mid_v = mountainArr.get(mid); if (mid_v < target) { return findLeftTarget(mid+1, right, mountainArr, target) } else if (mid_v > target) { return findLeftTarget(left, mid, mountainArr, target) } else { return mid; } return -1 } var findRightTarget = function(left, right, mountainArr, target) { if (right - left <= 1) { let left_v = mountainArr.get(left); if (left_v === target) { return left; } let right_v = mountainArr.get(right); if (right_v === target) { return right; } return -1 } let mid = left + ((right - left) >> 1); let mid_v = mountainArr.get(mid); if (mid_v > target) { return findLeftTarget(mid+1, right, mountainArr, target) } else if (mid_v < target) { return findLeftTarget(left, mid, mountainArr, target) } else { return mid; } return -1 }
|