LeetCode in Kotlin

3066. Minimum Operations to Exceed Threshold Value II

Medium

You are given a 0-indexed integer array nums, and an integer k.

In one operation, you will:

Note that you can only apply the described operation if nums contains at least two elements.

Return the minimum number of operations needed so that all elements of the array are greater than or equal to k.

Example 1:

Input: nums = [2,11,10,1,3], k = 10

Output: 2

Explanation: In the first operation, we remove elements 1 and 2, then add 1 * 2 + 2 to nums. nums becomes equal to [4, 11, 10, 3].

In the second operation, we remove elements 3 and 4, then add 3 * 2 + 4 to nums. nums becomes equal to [10, 11, 10].

At this stage, all the elements of nums are greater than or equal to 10 so we can stop.

It can be shown that 2 is the minimum number of operations needed so that all elements of the array are greater than or equal to 10.

Example 2:

Input: nums = [1,1,2,4,9], k = 20

Output: 4

Explanation: After one operation, nums becomes equal to [2, 4, 9, 3].

After two operations, nums becomes equal to [7, 4, 9].

After three operations, nums becomes equal to [15, 9].

After four operations, nums becomes equal to [33].

At this stage, all the elements of nums are greater than 20 so we can stop.

It can be shown that 4 is the minimum number of operations needed so that all elements of the array are greater than or equal to 20.

Constraints:

Solution

class Solution {
    fun minOperations(nums: IntArray, k: Int): Int {
        val n = nums.size
        var steps = 0
        nums.sort()
        val extra: MutableList<Int> = ArrayList()
        var i = 0
        var j = 0
        while ((i < n && nums[i] < k) || (j < extra.size && extra[j] < k)) {
            val min = if (i < n && (j >= extra.size || extra[j] > nums[i])) {
                nums[i++]
            } else {
                extra[j++]
            }
            val max = if (i < n && (j >= extra.size || extra[j] > nums[i])) {
                nums[i++]
            } else {
                extra[j++]
            }
            steps++
            var res = min.toLong()
            res = 2 * res + max
            if (res > Int.MAX_VALUE) {
                extra.add(Int.MAX_VALUE)
            } else {
                extra.add(res.toInt())
            }
        }
        return steps
    }
}