LeetCode in Kotlin

3854. Minimum Operations to Make Array Parity Alternating

Medium

You are given an integer array nums.

An array is called parity alternating if for every index i where 0 <= i < n - 1, nums[i] and nums[i + 1] have different parity (one is even and the other is odd).

In one operation, you may choose any index i and either increase nums[i] by 1 or decrease nums[i] by 1.

Return an integer array answer of length 2 where:

An array of length 1 is considered parity alternating.

Example 1:

Input: nums = [-2,-3,1,4]

Output: [2,6]

Explanation:

Applying the following operations:

The resulting array is parity alternating, and the value of max(nums) - min(nums) = 3 - (-3) = 6 is the minimum possible among all parity alternating arrays obtainable using exactly 2 operations.

Example 2:

Input: nums = [0,2,-2]

Output: [1,3]

Explanation:

Applying the following operation:

The resulting array is parity alternating, and the value of max(nums) - min(nums) = 1 - (-2) = 3 is the minimum possible among all parity alternating arrays obtainable using exactly 1 operation.

Example 3:

Input: nums = [7]

Output: [0,0]

Explanation:

No operations are required. The array is already parity alternating, and the value of max(nums) - min(nums) = 7 - 7 = 0, which is the minimum possible.

Constraints:

Solution

import kotlin.math.max
import kotlin.math.min

class Solution {
    fun makeParityAlternating(nums: IntArray): IntArray? {
        if (nums.size == 1) {
            return intArrayOf(0, 0)
        }
        var zero = 0
        var one = 0
        for (i in nums.indices) {
            if ((nums[i] and 1) != (i and 1)) {
                zero++
            }
            if ((nums[i] and 1) != ((i + 1) and 1)) {
                one++
            }
        }
        val ans = IntArray(2)
        ans[0] = min(one, zero)
        if (one == zero) {
            ans[1] = min(`fun`(nums, 0), `fun`(nums, 1))
        } else if (one > zero) {
            ans[1] = `fun`(nums, 0)
        } else {
            ans[1] = `fun`(nums, 1)
        }
        return ans
    }

    private fun `fun`(nums: IntArray, parity: Int): Int {
        var max = Int.MIN_VALUE
        var min = Int.MAX_VALUE
        for (i in nums.indices) {
            if ((nums[i] and 1) == ((i + parity) and 1)) {
                max = max(max, nums[i])
                min = min(min, nums[i])
            } else {
                max = max(max, nums[i] - 1)
                min = min(min, nums[i] + 1)
            }
        }
        return max(max - min, 1)
    }
}