给定一个奇数大小的数组。您必须从数组中删除任何一个元素,然后查找是否可以将剩余的偶数大小数组分成两组大小相等的元素并且具有相同的元素总和。从数组中删除任何一个元素是强制性的。从数组中删除任何一个元素后,将奇数大小的数组分成两组相等大小和相同的总和
-2
A
回答
0
所以在这里,我假设有必要从数组中删除1个元素。
请看下面的代码片段。
int solve(int idx, int s, int cntr, int val) {
if(idx == n)
if(cntr != 1)
return INT_MAX;
else
return abs((sum-val)-2*s);
int ans = INT_MAX;
if(cntr == 0)
ans = min(ans, solve(idx+1, s, cntr+1, arr[idx]));
else
ans = min(ans, min(solve(idx+1,s+arr[idx], cntr, val), solve(idx+1, s, cntr, val)));
return ans;
}
这里sum
是原始数组的总和, val
是其中U要删除的位置的元素的 值,并且cntr
跟踪任何值是否被从阵列或不除去。
所以算法就是这样。
忘记你需要删除任何值,然后问题变成是否可以将数组分成2等份和半。现在我们可以想到这个问题,比如将数组分成2个部分,使得abs(sum-2*sum_of_any_half_part)
最小化。所以有了这个想法让我们说我最初有一个桶s
它可以是我们所关心的阵列的一部分。因此,在每一步我们都可以将任何元素放入此部分或将其留给其他部分。
现在,如果我们在这个问题中引入删除部分,它只需要一个小的改变。现在在每个步骤而不是2个,你有3个选项。
- 要删除该特定的元素,然后增加至
cntr
1和val
到元素的值的数组中的索引处。 - 不要对此元素做任何事情。这等于将该元素放入其他桶/一半
- 将该元素放入桶
s
中,即将s的值增加arr[idx]
;
现在递归地检查哪个给出了最好的结果。
P.S.查看代码片段中的基本案例以获得更好的想法。
最后如果上面的solve
函数给出了ans = 0,那么这意味着是我们可以在删除任何元素之后将数组划分为2个等份部分。
希望这会有所帮助。
相关问题
- 1. 用相同的元素将数组分成小数组
- 2. 最大化一个数组的总和,同时保持其他数组的相应元素的和小于k
- 3. 将一个数组划分为两个相等大小的子集,它们的总和差值最小
- 4. 总和不同大小的数组的
- 5. 如何删除数组中的元素并缩小其大小?
- 6. 编写一个获取两个int数组的方法,这两个int数组的大小相同,并返回一个数组,该数组的总和为
- 7. 将大小相等的数组合并到平铺大数组中
- 8. 按升序合并两个数组(两个数组的大小相同)
- 9. 将n个数字分成两组,每组的总和小于等于k
- 10. 如何从数组中删除相同元素的元素
- 11. 如何从两个相同大小的数组中构建一个Ruby哈希?
- 12. 解除分配后的数组大小
- 13. 二维数组中非相邻元素的最大总和
- 14. 集成一个返回相同大小的数组而不是在Python中的元组的数组?
- 15. C++最大/在一个数组分钟元素不知道数组的大小
- 16. 如何将一个大数组切片成较小的数组
- 17. 从数组生成在大小两个postgres的唯一组合
- 18. 使用HashMap查找两个相等大小的数组中的相似元素的计数
- 19. 如何获得数组中偶数元素的奇数和相乘的总和
- 20. n变换后数组中最大的相同元素数
- 21. 包含相同元素的两个数组不能相等吗?
- 22. 我可以使用每两个相同大小的数组
- 23. 比较两个相同大小的diff数组
- 24. C++将int数组赋给一个int数组,其大小相同
- 25. 将数字集合分成两组,总数相等
- 26. 将数组分成两部分。预定的大小,可能并不总是相等的
- 27. 给定两个相同大小的数组,找到两个数组中的几个元素,它们与最小的绝对值进行求和
- 28. Vb.net总结相同的数组元素
- 29. 删除数组中的元素并调整其大小
- 30. 数组求和元素的相同值?
在给定的问题中是否需要删除任何一个元素。我的意思是,如果我可以在不删除任何元素的情况下将数组分成2个等分半部分。我应该认为这是一个解决方案。 – Roshan
也请给出完整的问题约束,如数组的大小和数组中任何元素的最大值。 – Roshan
@Roshan这个问题来自Techgig网站,数组的大小高达100000.这就是为什么通过子集和问题来解决它似乎是昂贵的,因为它具有O(n * sum)时间复杂度。 –