LeetCode in Kotlin

1095. Find in Mountain Array

Hard

(This problem is an interactive problem.)

You may recall that an array arr is a mountain array if and only if:

Given a mountain array mountainArr, return the minimum index such that mountainArr.get(index) == target. If such an index does not exist, return -1.

You cannot access the mountain array directly. You may only access the array using a MountainArray interface:

Submissions making more than 100 calls to MountainArray.get will be judged Wrong Answer. Also, any solutions that attempt to circumvent the judge will result in disqualification.

Example 1:

Input: array = [1,2,3,4,5,3,1], target = 3

Output: 2

Explanation: 3 exists in the array, at index=2 and index=5. Return the minimum index, which is 2.

Example 2:

Input: array = [0,1,2,4,2,1], target = 3

Output: -1

Explanation: 3 does not exist in the array, so we return -1.

Constraints:

Solution

/*
 * // This is MountainArray's API interface.
 * // You should not implement it, or speculate about its implementation
 * class MountainArray {
 *     fun get(index: Int): Int {}
 *     fun length(): Int {}
 * }
 */

class Solution {
    fun findInMountainArray(target: Int, mountainArr: MountainArray): Int {
        val peakIndex = findPeak(mountainArr)
        if (target == mountainArr.get(peakIndex)) {
            return peakIndex
        }
        val leftResult = findInPeakLeft(target, peakIndex, mountainArr)
        return if (leftResult != -1) {
            leftResult
        } else {
            findInPeakRight(target, peakIndex, mountainArr)
        }
    }

    private fun findPeak(mountainArray: MountainArray): Int {
        val len: Int = mountainArray.length()
        var left = 0
        var right = len - 1
        while (left < right) {
            val mid = left + (right - left) / 2
            if (mountainArray.get(mid) < mountainArray.get(mid + 1)) {
                left = mid + 1
            } else {
                right = mid
            }
        }
        return left
    }

    private fun findInPeakLeft(target: Int, peakIndex: Int, mountainArray: MountainArray): Int {
        var leftIndex = 0
        var rightIndex = peakIndex - 1
        while (leftIndex < rightIndex) {
            val midIndex = leftIndex + (rightIndex - leftIndex) / 2
            if (target > mountainArray.get(midIndex)) {
                leftIndex = midIndex + 1
            } else {
                rightIndex = midIndex
            }
        }
        return if (target == mountainArray.get(leftIndex)) leftIndex else -1
    }

    private fun findInPeakRight(target: Int, peakIndex: Int, mountainArray: MountainArray): Int {
        var leftIndex = peakIndex + 1
        var rightIndex: Int = mountainArray.length() - 1
        while (leftIndex < rightIndex) {
            val midIndex = leftIndex + (rightIndex - leftIndex) / 2
            if (target < mountainArray.get(midIndex)) {
                leftIndex = midIndex + 1
            } else {
                rightIndex = midIndex
            }
        }
        return if (target == mountainArray.get(leftIndex)) leftIndex else -1
    }
}
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy