Description
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:
- Every even-indexed element is greater than adjacent elements, ie. A[0] > A[1] < A[2] > A[3] < A[4] > …
- OR, every odd-indexed element is greater than adjacent elements, ie. 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.
分析
题目的意思是:给定一个数组,求变成zigzag形式的数组所需要最小的变换步数。题目我是读懂了,怎么做我就犯浑了,我参考了一下别人的实现,发现没看懂,zigzag有两种情况,第一种是一开始递增,zig形式;另一种是一开始递减,zag形式。遍历整个数组,在每一步需要记录这两种形式所需要的步数,同时需要记录最后修改的数。
代码
class Solution:
def movesToMakeZigzag(self, nums: List[int]) -> int:
zig,zag=0,0
prev_zig,prev_zag=nums[0],nums[0]
n=len(nums)
for i in range(1,n):
if(i%2==0):
zig+=max(0,prev_zig-nums[i]+1)
prev_zig=nums[i]
zag+=max(0,nums[i]-prev_zag+1)
prev_zag=nums[i]-max(0,nums[i]-prev_zag+1)
else:
zag+=max(0,prev_zag-nums[i]+1)
prev_zag=nums[i]
zig+=max(0,nums[i]-prev_zig+1)
prev_zig=nums[i]-max(0,nums[i]-prev_zig+1)
return min(zig,zag)