给你一个整数列表,长度为偶数。考虑这样一个操作,您在nums中选择任意数字,并用[1,max(nums)]之间的值更新它。返回所需的操作数,使得对于每个i,nums[i]+nums[n-1-i]等于相同的数。问题可以贪婪地解决。
注意:n是数组的大小,max(nums)是nums中的最大元素。
设i=0,nums[0]+nums[6-1-0]=4。
i=1,nums[1]+nums[6-1-1]=14。
i=2,nums[2]+nums[6-1-2]=9。
int operations = 0;
for(int i=0; i<nums.size()/2; i++) {
if(nums[i] + nums[nums.size()-1-i] == mid)
continue;
if(nums[i] + nums[nums.size()-1-i] > mid) {
if(nums[i] + 1 <= mid || 1 + nums[nums.size()-1-i] <= mid) {
operations++;
} else {
operations += 2;
}
} else if (maxnums + nums[nums.size()-1-i] >= mid || nums[i] + maxnums >= mid) {
operations++;
} else {
operations += 2;
}
}
选择中位数不是最优的方法吗?有人能提供一个更好的方法吗?
为了提供一些理论--我们可以很容易地说明所需更改的上限是n/2
,其中n
是元素的数量。这是因为可以对1+C
和max(nums)+C
之间的任何内容进行一次更改,其中C
是一对中的两个元素之一。对于最小的C
,我们最高可以绑定max(nums)+1
;对于最大的C
,我们可以将1+max(nums)
绑定到最低。
由于这两个边界在最坏的情况下是相等的,我们可以保证有一个最多n/2
更改的解决方案,使至少一个C
(数组元素)保持不变。
由此我们得出结论,一个最优解要么(1)至少有一对,其中两个元素都不改变,其余的元素每对只需要改变一次,要么(2)我们的最优解有n/2
改变,如上所述。
因此,我们可以继续测试每个现有对的单一或零变化可能性作为候选。我们可以迭代每对两到三种可能性的排序列表,并用每个成本和索引标记。(本页上的其他作者也提供了类似的方法和代码。)
我正在阅读这个问题的极客为极客网站。
我在一次采访中被问到这个问题。给定一个整数数组(具有正值和负值),我们需要找到具有相等总和的不相交子数组的最大数量。 例子: 输入:[1,2,3]输出:2{因为我们最多有2个子数组,总和=3,即[1,2],[3]} 输入: [2 2 2 -2] 输出 : 2 {两个子数组,每个子数组的总和 = 2,即 [2],[2, 2, -2]} 我的方法 我想到的第一种方法是找到前缀和数组,然后以每个元素(前
本文向大家介绍在C ++中执行给定操作后,数组中最大数目的相等数,包括了在C ++中执行给定操作后,数组中最大数目的相等数的使用技巧和注意事项,需要的朋友参考一下 给我们一个整数数组。目标是在执行给定操作后找到数组中等于的最大数- 选择两个元素a [i]和a [j],使i!= j和 递增a [i]并递减a [j](a [i] ++,a [j]-) 我们将取数组的总和除以元素数。如果N是数组的大小,
问题内容: 我刚刚发现了新的Java8流功能。来自Python,我想知道现在是否有一种巧妙的方法可以对数组进行操作,例如求和,以“单行pythonic”的方式将两个数组相乘? 谢谢 问题答案: 添加了新的方法来将数组转换为Java 8流,然后将其用于求和等。 将两个数组相乘会有点困难,因为我想不出一种与Stream操作同时获取值和索引的方法。这意味着您可能必须流式处理数组的索引。 编辑 批评家@H
我想检查是否可以将一个数组拆分为具有相同和的连续子数组。拆分数组还意味着删除数组的边框元素。 例如,要将其拆分为3个部分,我们需要删除到元素 通过删除这2个元素,就有3个相同和的连续子数组,和。 因此,如果可以将数组拆分为3个部分(等和)并删除它们之间的边界,则应返回true,否则应返回false。 返回的示例是。因为删除2个元素后,它将有4个元素,这些元素不能分组为3个相等的和 我不知道如何处理
给定两个序列和,长度相同。在每个步骤中,您可以设置if