You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过最少操作次数使数组A与目标数组相似?

如何计算将数组A转换为相似目标数组的最少操作次数?

问题描述

给定数组A和目标数组,需通过指定操作使A与目标数组相似(相似定义:每个元素的频率完全相同)。允许的操作是:每次选择两个索引(i,j),将A[i]加2,同时将A[j]减2,两项操作必须同时执行。若无法实现相似则返回-1,否则返回最少操作次数。

已验证的基础结论

  • 若sum(A) != sum(目标数组),直接返回-1(操作不改变数组总和);
  • 任意原数组元素与目标数组对应元素的奇偶性必须一致(因为操作只能增减2的倍数),否则无法实现相似。

后续解决步骤

1. 拆分并校验奇偶分组

由于操作无法改变元素的奇偶性,我们需要:

  • 将原数组A拆分为奇数列表A_odd和偶数列表A_even,分别排序;
  • 将目标数组拆分为奇数列表T_odd和偶数列表T_even,分别排序;
  • 校验:len(A_odd)必须等于len(T_odd),len(A_even)必须等于len(T_even)。若不满足,直接返回-1(奇偶元素的数量不匹配,频率不可能一致)。

2. 计算分组内的元素差值

对排序后的奇偶分组分别处理:

  • 遍历A_odd和T_odd的对应位置,计算每个元素的差值:diff_odd[i] = A_odd[i] - T_odd[i];
  • 遍历A_even和T_even的对应位置,计算每个元素的差值:diff_even[i] = A_even[i] - T_even[i];
  • 注意:每组的差值总和必须为0(因为数组总和相等,拆分后每组的总和差必然为0,若不为0则说明之前的校验遗漏)。

3. 统计操作次数

操作的本质是将元素中"多余的2的倍数"转移到"缺少2的倍数"的元素上,每次操作可转移1个单位的2(即+2和-2各一次)。

  • 对于奇数组:遍历diff_odd,收集所有正差值(表示该元素需要减少2的倍数,可提供转移量),将每个正差值除以2后累加,得到奇数组的操作次数;
  • 对于偶数组:执行同样的操作,累加正差值除以2的结果,得到偶数组的操作次数;
  • 总操作次数为两组操作次数之和。

示例验证

假设:
A = [1,1,3,4],目标数组 = [3,3,1,2]

  1. 拆分排序:
    • A_odd = [1,1,3],T_odd = [1,3,3]
    • A_even = [4],T_even = [2]
  2. 计算差值:
    • diff_odd = [0, -2, 0],正差值总和为0
    • diff_even = [2],正差值除以2得1
  3. 总操作次数:0 + 1 = 1,与实际操作逻辑一致(将4减2,第二个1加2,得到目标数组)。

内容的提问来源于stack exchange,提问作者Parth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 08:55:25