力扣刷题:1664. 生成平衡数组的方案数

记录自己第一个100%(虽然不是双百)

力扣刷题:1664. 生成平衡数组的方案数

 

解题思路

通过推算我们可以得出这样一个解题思路:
(1)首先,我们将未进行操作前的奇数和以及偶数和分别求出来并保存
(2)然后由于每个计算都可以拆分为:和 = 左+右,那么我们需要再分别求出左右两侧的奇数和以及偶数和
(3)通过推算发现删除当前元素之后,删除元素左侧元素的下标奇偶性未发生改变,而右侧奇偶性互换
(4)得到规律:
①当前元素下标为奇数的时候:奇数和 = 左侧奇数和 + 右侧偶数和 ; 偶数和 = 左侧偶数和+ 【右侧奇数和 - nums[i]】
②当前元素下标为偶数的时候:奇数和 = 左侧奇数和 + 【右侧偶数和 - nums[i]】 ;偶数和 = 左侧偶数和 + 右侧奇数和
解题过程中出现的问题:在进行步骤(2)的时候发现当前元素算在了左侧,导致进行步骤(4)运算的时候出现错误;
解决方法:(1)当前元素下标为奇数的时候计算的是左侧的偶数和,即 leftEven += nums[i-1]
(2)当前元素下标为偶数的时候计算的是左侧的奇数和,即 leftOdd += nums[i-1] (具体看代码求左侧奇偶数和部分)
ps:在进行左侧数据计算的时候要注意将第一位元素(nums[0])单独列出

 

 代码部分:

/**
 * @param {number[]} nums
 * @return {number}
 */
 //1、计算删除元素前奇数和、偶数和
 //2、分别计算删除元素左右两侧的奇数和、偶数和
 //3、删除下标若为奇数,则奇数和 = 左侧奇数和+【右侧偶数和-删除元素】、偶数和= 左侧偶数和+ 右侧奇数和
 //3、删除下标若为偶数,则奇数和 = 左侧奇数和+右侧偶数和、偶数和= 左侧偶数和+【右侧偶数和-删除元素】
var waysToMakeFair = function(nums) {
   let length = nums.length;
      let sumOdd = 0; //记录未删减前奇数的和
      let sumEven = 0; //记录未删减前偶数的和
      let rightOdd = 0; //记录右侧奇数和
      let leftOdd = 0; //记录左侧奇数和
      let rightEven = 0; //记录右侧偶数和
      let leftEven = 0; //记录左侧偶数和
      let count = 0;
      //分别求的未进行操作前奇偶数下标元素的和
      for (let i = 0; i < length; i++)
        i % 2 === 0 ? (sumEven += nums[i]) : (sumOdd += nums[i]);
      for (let i = 0; i < length; i++) {
        // 分别求的当前元素左侧奇、偶数和
        i === 0
          ? (leftOdd = 0)
          : i % 2 === 0
          ? (leftOdd += nums[i - 1])
          : (leftEven += nums[i - 1]);
        // 分别求的当前元素右侧奇、偶数和
        rightOdd = sumOdd - leftOdd;
        rightEven = sumEven - leftEven;
        i % 2 === 0 ? (rightEven -= nums[i]) : (rightOdd -= nums[i]);
        if (rightOdd + leftEven === rightEven + leftOdd) count++;
      }
      return count
};

 

上一篇:文巾解题 1711. 大餐计数


下一篇:仓位管理的基本原则