这道题说实话理清楚的话很简单,就是很容易绕进去,刚开始绕进去了很难受,解了半天才出来。。。。
给你一个整数数组 nums,每次 操作 会从中选择一个元素并 将该元素的值减少 1。
如果符合下列情况之一,则数组 A 就是 锯齿数组:
每个偶数索引对应的元素都大于相邻的元素,即 A[0] > A[1] < A[2] > A[3] < A[4] > ...
或者,每个奇数索引对应的元素都大于相邻的元素,即 A[0] < A[1] > A[2] < A[3] > A[4] < ...
返回将数组 nums 转换为锯齿数组所需的最小操作次数。
示例 1:
输入:nums = [1,2,3]
输出:2
解释:我们可以把 2 递减到 0,或把 3 递减到 1。
示例 2:
输入:nums = [9,6,1,6,2]
输出:4
提示:
1 <= nums.length <= 1000
1 <= nums[i] <= 1000
int movesToMakeZigzag(int* nums, int numsSize){
int flag,sum1=0,sum2=0,arr[numsSize],i,j;
if(numsSize%2==1){
flag=2;
}else{
flag=1;
}
for(j=0;j<numsSize;j++)
{
arr[j]=nums[j];
}
for(i=1;i<=numsSize-2;i+=2)
{
if(arr[i+1]>=arr[i])
{
sum1+=arr[i+1]-arr[i]+1;
arr[i+1]=arr[i]-1;
}
if(nums[i+1]<=nums[i])
{
sum2+=nums[i]-nums[i+1]+1;
nums[i]=nums[i+1]-1;
}
}
for(i=numsSize-flag;i>=1;i-=2)
{
if(arr[i-1]>=arr[i])
{
sum1+=arr[i-1]-arr[i]+1;
}
if(nums[i-1]<=nums[i])
{
sum2+=nums[i]-nums[i-1]+1;
}
}
return fmin(sum1,sum2);
}
时间复杂度因为是o(n)所以很少,但是多用了一个数组所以空间复杂度o(n)比较高一点