1144. 递减元素使数组呈锯齿状
1.想法
1.要形成锯齿状,那么一定是奇数大于偶数,或者偶数大于奇数
2.不论是奇数还是偶数,都满足nums[i]<nums[i-1]&nums[i]<nums[i+1]
如果不满足,那么就需要尽心调整,
1.nums[i]大于nums[i+1]或nums[i-1] 那么只需调整一次,变成nums[i] = 大于的那个数-1就行了
2.nums[i]大于nums[i+1]且nums[i-1] 那么需调整两次,变成nums[i] =min(nums[i-1],nums[i+1])-1就行了
综上,我们需要计算偶数大于和奇数大于的次数,进行比较返回
2:代码
class Solution {
public int movesToMakeZigzag(int[] nums) {
int temp0 = 0, temp1 = 0;//分别记录当为0或者1的时候的减去值
int i0 = 0, i1 = 1; //分别是奇数和偶数的索引
//计算偶数大于奇数的修改的次数
while (i1 < nums.length) {
int temp = nums[i1];
if (temp >= nums[i1 - 1]) {
temp0 += temp - nums[i1 - 1] + 1;
temp = nums[i1 - 1] - 1;
}
if (i1 + 1 < nums.length) {
if (temp >= nums[i1 + 1]) {
temp0 += temp - nums[i1 + 1] + 1;
temp = nums[i1+1]-1;
}
}
i1 += 2;
}
//计算奇数大于偶数的修改次数
while (i0 < nums.length) {
int temp = nums[i0];
if (i0 - 1 >= 0) {
if (temp >= nums[i0 - 1]) {
temp1 += temp - nums[i0 - 1] + 1;
temp = nums[i0-1]-1;
}
}
if (i0 + 1 < nums.length) {
if (temp >= nums[i0 + 1]){
temp1 += temp - nums[i0 + 1] + 1;
temp=nums[i0+1]-1;
}
}
i0 += 2;
}
return temp0 > temp1 ? temp1 : temp0;
}
}
总结:这道题本身没有多少难度,但是作为测验题,却又很多人没有通过,通过率很低
说明了人在高度紧张的时候会犯低级错误,唯有平静心态才能取得胜利