louzhedong / blog

前端基础,深入以及算法数据结构
934 stars 84 forks source link

递减元素使数组呈锯齿状 #173

Open louzhedong opened 5 years ago

louzhedong commented 5 years ago

习题

给你一个整数数组 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;
}