递减元素使数组呈锯齿状
louzhedong opened this issue · comments
Miracle commented
习题
给你一个整数数组
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
思路
如果向量两个元素,大小顺序不对,总有一个元素需要执行递减的操作
解答
/**
* @param {number[]} nums
* @return {number}
*/
var movesToMakeZigzag = function (nums) {
var copyNums = copy(nums);
// nums[0] > nums[1]
var count1 = 0;
for (var i = 0; i < nums.length - 1; i++) {
if (i % 2 == 0) { // 偶数
while (nums[i] <= nums[i + 1]) {
nums[i + 1]--;
count1++;
}
} else {
while (nums[i] >= nums[i + 1]) {
nums[i]--;
count1++;
}
}
}
// nums[0] < nums[1]
var count2 = 0;
for (var i = 0; i < copyNums.length - 1; i++) {
if (i % 2 == 0) { // 偶数
while (copyNums[i] >= copyNums[i + 1]) {
copyNums[i]--;
count2++;
}
} else {
while (copyNums[i] <= copyNums[i + 1]) {
copyNums[i + 1]--;
count2++;
}
}
if (copyNums.length % 2 != 0) {
if (copyNums[copyNums.length - 1] >= copyNums[copyNums.length - 2]) {
copyNums[copyNums.length - 1]--;
count2++;
}
}
}
return Math.min(count1, count2);
};
function copy(array) {
var res = [];
for (var i = 0; i < array.length; i++) {
res.push(array[i]);
}
return res;
}