LeetCode in Kotlin

3576. Transform Array to All Equal Elements

Medium

You are given an integer array nums of size n containing only 1 and -1, and an integer k.

You can perform the following operation at most k times:

Note that you can choose the same index i more than once in different operations.

Return true if it is possible to make all elements of the array equal after at most k operations, and false otherwise.

Example 1:

Input: nums = [1,-1,1,-1,1], k = 3

Output: true

Explanation:

We can make all elements in the array equal in 2 operations as follows:

Example 2:

Input: nums = [-1,-1,-1,1,1,1], k = 5

Output: false

Explanation:

It is not possible to make all array elements equal in at most 5 operations.

Constraints:

Solution

class Solution {
    fun canMakeEqual(nums: IntArray, k: Int): Boolean {
        val n = nums.size
        if (n == 1) {
            return true
        }
        var prod = 1
        for (x in nums) {
            prod *= x
        }
        val targets: MutableList<Int> = ArrayList<Int>()
        for (target in intArrayOf(1, -1)) {
            val tPowN = (if (n % 2 == 0) 1 else target)
            if (tPowN == prod) {
                targets.add(target)
            }
        }
        if (targets.isEmpty()) {
            return false
        }
        for (target in targets) {
            var ops = 0
            val a = nums.clone()
            var i = 0
            while (i < n - 1 && ops <= k) {
                if (a[i] != target) {
                    a[i] = -a[i]
                    a[i + 1] = -a[i + 1]
                    ops++
                }
                i++
            }
            if (ops <= k && a[n - 1] == target) {
                return true
            }
        }
        return false
    }
}