给你一个整数数组 nums 。你需要选择 恰好 一个下标(下标从 0 开始)并删除对应的元素。请注意剩下元素的下标可能会因为删除操作而发生改变。
比方说,如果 nums = [6,1,7,4,1] ,那么:
选择删除下标 1 ,剩下的数组为 nums = [6,7,4,1] 。
选择删除下标 2 ,剩下的数组为 nums = [6,1,4,1] 。
选择删除下标 4 ,剩下的数组为 nums = [6,1,7,4] 。
如果一个数组满足奇数下标元素的和与偶数下标元素的和相等,该数组就是一个 平衡数组 。
请你返回删除操作后,剩下的数组 nums 是 平衡数组 的 方案数 。
示例 1:
输入:nums = [2,1,6,4]
输出:1
解释:
删除下标 0 :[1,6,4] -> 偶数元素下标为:1 + 4 = 5 。奇数元素下标为:6 。不平衡。
删除下标 1 :[2,6,4] -> 偶数元素下标为:2 + 4 = 6 。奇数元素下标为:6 。平衡。
删除下标 2 :[2,1,4] -> 偶数元素下标为:2 + 4 = 6 。奇数元素下标为:1 。不平衡。
删除下标 3 :[2,1,6] -> 偶数元素下标为:2 + 6 = 8 。奇数元素下标为:1 。不平衡。
只有一种让剩余数组成为平衡数组的方案。
示例 2:
输入:nums = [1,1,1]
输出:3
解释:你可以删除任意元素,剩余数组都是平衡数组。
示例 3:
输入:nums = [1,2,3]
输出:0
解释:不管删除哪个元素,剩下数组都不是平衡数组。
提示:
1 <= nums.length <= 105
1 <= nums[i] <= 104
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/ways-to-make-a-fair-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
从刚开始两数之和就是梦结束的地方,到现在中下难度的题大部分都可以做出来,感慨颇多。
这道题我应该是用了动态规划的思想(虽然我到现在也还是只知道动态规划是空间换时间(〃'▽'〃))。
可以发现,每次删除掉一个下标为i的元素,之后的元素都会奇偶互换,而这个元素之前的元素不会改变。
我们可以用两个变量来存储前面元素的奇偶和,每次对后面元素的奇偶和进行互换。
这样只需要对数组进行两次遍历,时间复杂度为O(N),n 为数组长度。
代码如下:
class Solution { public int waysToMakeFair(int[] nums) { // 存储删除元素后面的下标为偶数元素的和。 int sum0 = 0; // 存储删除元素后面的下标为奇数元素的和。 int sum1 = 0; for (int i = 0; i < nums.length; i ++) { if (i % 2 == 0) { sum0 += nums[i]; } else { sum1 += nums[i]; } } // 存储最终结果 int res = 0; // 存储删除元素前面的下标为偶数的元素的和。 int tem0 = 0; // 存储删除元素前面的下标为奇数的元素的和。 int tem1 = 0; for (int i = 0; i < nums.length; i ++) { // i分别为奇数和偶数时,前面元素的下标奇数和以及下标偶数和分别加上nums[i] if (i % 2 == 0) { sum0 -= nums[i]; // 删除元素后面元素互换。算数表达式在运行时应该是利用栈来实现的,利用这个特点,可以省空间。 sum0 = sum1 + (sum1 = sum0) - sum0; if (tem0 + sum0 == tem1 + sum1) { res ++; } tem0 += nums[i]; } else { sum1 -= nums[i]; sum0 = sum1 + (sum1 = sum0) - sum0; if (tem0 + sum0 == tem1 + sum1) { res ++; } tem1 += nums[i]; } // 再次互换。 sum0 = sum1 + (sum1 = sum0) - sum0; } return res; } }
运行结果:
我用的就是动态规划,放一个官解。
class Solution { public int waysToMakeFair(int[] nums) { int odd1 = 0, even1 = 0; int odd2 = 0, even2 = 0; for (int i = 0; i < nums.length; ++i) { if ((i & 1) != 0) { odd2 += nums[i]; } else { even2 += nums[i]; } } int res = 0; for (int i = 0; i < nums.length; ++i) { if ((i & 1) != 0) { odd2 -= nums[i]; } else { even2 -= nums[i]; } if (odd1 + even2 == odd2 + even1) { ++res; } if ((i & 1) != 0) { odd1 += nums[i]; } else { even1 += nums[i]; } } return res; } }
标签:力扣,下标,nums,int,元素,28,sum0,---,数组 From: https://www.cnblogs.com/allWu/p/17070869.html