class Solution:
def movesToMakeZigzag(self, nums):
def moves(nums, is_even):
res = 0
n = len(nums)
for i in range(n):
if (i % 2 == 0) == is_even:
left = nums[i - 1] if i - 1 >= 0 else float('inf')
right = nums[i + 1] if i + 1 < n else float('inf')
min_adj = min(left, right)
if nums[i] >= min_adj:
res += nums[i] - min_adj + 1
return res
return min(moves(nums, True), moves(nums, False))
class Solution {
public:
int movesToMakeZigzag(vector<int>& nums) {
return min(helper(nums, 0), helper(nums, 1));
}
int helper(vector<int>& nums, int even) {
int n = nums.size(), res = 0;
for (int i = 0; i < n; ++i) {
if (i % 2 == even) {
int left = (i > 0) ? nums[i-1] : INT_MAX;
int right = (i+1 < n) ? nums[i+1] : INT_MAX;
int min_adj = min(left, right);
if (nums[i] >= min_adj) {
res += nums[i] - min_adj + 1;
}
}
}
return res;
}
};
class Solution {
public int movesToMakeZigzag(int[] nums) {
return Math.min(helper(nums, 0), helper(nums, 1));
}
private int helper(int[] nums, int even) {
int n = nums.length, res = 0;
for (int i = 0; i < n; ++i) {
if (i % 2 == even) {
int left = (i > 0) ? nums[i-1] : Integer.MAX_VALUE;
int right = (i+1 < n) ? nums[i+1] : Integer.MAX_VALUE;
int minAdj = Math.min(left, right);
if (nums[i] >= minAdj) {
res += nums[i] - minAdj + 1;
}
}
}
return res;
}
}
var movesToMakeZigzag = function(nums) {
function moves(nums, even) {
let res = 0, n = nums.length;
for (let i = 0; i < n; ++i) {
if ((i % 2 === 0) === even) {
let left = i > 0 ? nums[i-1] : Infinity;
let right = i+1 < n ? nums[i+1] : Infinity;
let minAdj = Math.min(left, right);
if (nums[i] >= minAdj) {
res += nums[i] - minAdj + 1;
}
}
}
return res;
}
return Math.min(moves(nums, true), moves(nums, false));
};
nums
, your goal is to make the array "zigzag" by decreasing the values of some elements. A "zigzag" array means that either:
nums
a zigzag array.
nums[i]
is not strictly less than the minimum of its neighbors, decrease nums[i]
just enough so that nums[i] < min(neighbors)
.nums = [2, 7, 10, 9, 8, 9]
.
nums[0], nums[2], nums[4]
to be peaks.nums[1]
: it should be a valley. Neighbors are 2 and 10. Since 7 < min(2,10)=2 is false, so decrease 7 to 1 (6 moves).nums[3]
: neighbors 10 and 8. 9 < min(10,8)=8 is false, so decrease 9 to 7 (2 moves).nums[5]
: neighbor 8. 9 < 8 is false, so decrease 9 to 7 (2 moves).nums[1], nums[3], nums[5]
are peaks.nums[0]
: neighbor 7. 2 < 7 is true, so 0 moves.nums[2]
: neighbors 7 and 9. 10 < min(7,9)=7 is false, decrease 10 to 6 (4 moves).nums[4]
: neighbors 9 and 9. 8 < min(9,9)=9 is true, so 0 moves.