Medium
Given an array nums
of integers, a move consists of choosing any element and decreasing it by 1.
An array A
is a zigzag array if either:
A[0] > A[1] < A[2] > A[3] < A[4] > ...
A[0] < A[1] > A[2] < A[3] > A[4] < ...
Return the minimum number of moves to transform the given array nums
into a zigzag array.
Example 1:
Input: nums = [1,2,3]
Output: 2
Explanation: We can decrease 2 to 0 or 3 to 1.
Example 2:
Input: nums = [9,6,1,6,2]
Output: 4
Constraints:
1 <= nums.length <= 1000
1 <= nums[i] <= 1000
@Suppress("NAME_SHADOWING")
class Solution {
fun movesToMakeZigzag(nums: IntArray): Int {
var nums = nums
var ans: Int
val n = nums.size
var cur = 0
if (n == 1) {
return 0
}
val clone = nums.clone()
run {
var i = 0
while (i < n) {
if (i == 0) {
if (nums[i] <= nums[i + 1]) {
cur += nums[i + 1] - nums[i] + 1
nums[i + 1] = nums[i] - 1
}
} else if (i == n - 1) {
if (nums[i] <= nums[i - 1]) {
cur += nums[i - 1] - nums[i] + 1
}
} else {
if (nums[i] <= nums[i + 1]) {
cur += nums[i + 1] - nums[i] + 1
nums[i + 1] = nums[i] - 1
}
if (nums[i] <= nums[i - 1]) {
cur += nums[i - 1] - nums[i] + 1
}
}
i += 2
}
}
ans = cur
cur = 0
nums = clone
var i = 1
while (i < n) {
if (i != n - 1 && nums[i] <= nums[i + 1]) {
cur += nums[i + 1] - nums[i] + 1
nums[i + 1] = nums[i] - 1
}
if (nums[i] <= nums[i - 1]) {
cur += nums[i - 1] - nums[i] + 1
}
i += 2
}
ans = Math.min(ans, cur)
return ans
}
}