当前位置: 首页 > 知识库问答 >
问题:

使数组对和相等的最小操作数

狄赞
2023-03-14

给你一个整数列表,长度为偶数。考虑这样一个操作,您在nums中选择任意数字,并用[1,max(nums)]之间的值更新它。返回所需的操作数,使得对于每个i,nums[i]+nums[n-1-i]等于相同的数。问题可以贪婪地解决。

注意:n是数组的大小,max(nums)是nums中的最大元素。

    null

设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;
    }
}

选择中位数不是最优的方法吗?有人能提供一个更好的方法吗?

共有1个答案

丌官和泰
2023-03-14

为了提供一些理论--我们可以很容易地说明所需更改的上限是n/2,其中n是元素的数量。这是因为可以对1+Cmax(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