力扣刷题:1664. 生成平衡数组的方案数
作者:互联网
记录自己第一个100%(虽然不是双百)
解题思路
通过推算我们可以得出这样一个解题思路:
(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 };
标签:偶数,元素,奇数,nums,力扣,let,左侧,1664,刷题 来源: https://www.cnblogs.com/beheTea/p/15160685.html