LeetCode-in-Scala.github.io

34. Find First and Last Position of Element in Sorted Array

Medium

Given an array of integers nums sorted in non-decreasing order, find the starting and ending position of a given target value.

If target is not found in the array, return [-1, -1].

You must write an algorithm with O(log n) runtime complexity.

Example 1:

Input: nums = [5,7,7,8,8,10], target = 8

Output: [3,4]

Example 2:

Input: nums = [5,7,7,8,8,10], target = 6

Output: [-1,-1]

Example 3:

Input: nums = [], target = 0

Output: [-1,-1]

Constraints:

Solution

object Solution {
    def searchRange(nums: Array[Int], target: Int): Array[Int] = {
        val ans = new Array[Int](2)
        ans(0) = helper(nums, target, equals = false)
        ans(1) = helper(nums, target, equals = true)
        ans
    }

    private def helper(nums: Array[Int], target: Int, equals: Boolean): Int = {
        var l = 0
        var r = nums.length - 1
        var result = -1
        while (l <= r) {
            val mid = l + (r - l) / 2
            if (nums(mid) == target) {
                result = mid
            }
            if (nums(mid) < target || (nums(mid) == target && equals)) {
                l = mid + 1
            } else {
                r = mid - 1
            }
        }
        result
    }
}