给你一个整数数组 nums,每次 操作 会从中选择一个元素并 将该元素的值减少 1。 如果符合下列情况之一,则数组 A 就是 锯齿数组: 每个偶数索引对应的元素都大于相邻的元素,即 A[0] > A[1] < A[2] > A[3] < A[4] > ... 或者,每个奇数索引对应的元素都大于相邻的元素,即 A[0] < A[1] > A[2] < A[3] > A[4] < ... 返回将数组 nums 转换为锯齿数组所需的最小操作次数。
来源:力扣(LeetCode) 链接:leetcode.cn/problems/de… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
- 1.锯齿起点有两种可能,下标为0 的起点可能是向下,也可能是向上
- 2.所以要求最小就要把两种方式的值求出来做比较
- 3.确定步长为2
- 4.如果是起点向上i(0,2,6,8...) 的位置应该比左右相邻的都小,是谷底,左右两边是峰顶
- 5.i位置的值减去左右相邻的值,如果为正数,说明左右应该提升几步才能形成峰顶,如果是负数,说明左右两边原本就是峰顶,不需要提升,a直接取0.所以用到
Math.max(0,x) - 6.如果是起点向下i(1,3,5,6...) 的位置应该比左右相邻的都小,是谷底,左右两边是峰顶
- 7.同5.
- 8.两种情况取最小值
/**
* @param {number[]} nums
* @return {number}
*/
var movesToMakeZigzag = function(nums) {
return Math.min(help(nums, 0),help(nums, 1))
};
function help (nums, lowPos) {
let res = 0
for(let i = lowPos; i < nums.length; i+=2) {
let a = 0;
if(i + 1 < nums.length) {
a = Math.max(a, nums[i] - nums[ i + 1] + 1)
}
if( i - 1 >=0) {
a = Math.max(a, nums[i] - nums[i - 1] + 1)
}
res += a
}
return res
}