如何通过最少操作次数使数组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]
- 拆分排序:
- A_odd = [1,1,3],T_odd = [1,3,3]
- A_even = [4],T_even = [2]
- 计算差值:
- diff_odd = [0, -2, 0],正差值总和为0
- diff_even = [2],正差值除以2得1
- 总操作次数:0 + 1 = 1,与实际操作逻辑一致(将4减2,第二个1加2,得到目标数组)。
内容的提问来源于stack exchange,提问作者Parth
相关产品推荐
相关产品推荐

