如果我们可以将特定数组元件增加/减少1,则最小总移动到平衡阵列
minimum total move to balance array if we can increase/decrease a specific array element by 1
它是leetcode 462。我有一种算法,但是在通过其他算法时,它未能进行一些测试。我试图思考,但不确定我忽略了什么角色。
我们有一个n个元素。一个动作被定义为1个数组的一个元素增加或减少1个。
我的想法是:1.找到平均2.找到最接近平均值的元素3.将每个元素与最接近平均值的元素之间的差异总结。我想念什么?请提供一个反示例。
class Solution {
public:
int minMoves2(vector<int>& nums) {
int sum=0;
for(int i=0;i<nums.size();i++){
sum += nums[i];
}
double avg = (double) sum / nums.size();
int min = nums[0];
int index =0 ;
for(int i=0;i<nums.size();i++){
if(abs(nums[i]-avg) <= abs(min - avg)){
min = nums[i];
index = i;
}
}
sum=0;
for(int i=0;i<nums.size();i++){
sum += abs(min - nums[i]);
}
return sum;
}
};
假设数组为[1、1、10、20、100]。平均值有点超过20。因此,您的解决方案将涉及19 19 10 10 0 80移动=128。如果我们定位10,该怎么办?然后,我们有9 9 0 10 90移动= 118。
假设您决定针对将所有数组元素更改为某个值T的目标。问题是,t的正确值是什么?鉴于t的一定价值,我们可以询问增加或减少t是否会改善或恶化我们的结果。如果我们将t降低1,那么所有值大于t都需要额外的移动,而下面的所有值都需要少移动。这意味着,如果t高于中位数,则比上面有更多的值,因此我们受益于降低T。如果T小于中位数,我们可以提出相反的论点。由此我们可以得出结论,T的正确值实际上是中位数本身,我的示例证明了这一点(严格来说,当您具有均匀尺寸的数组时,T可以在两个中间元素之间进行任何位置)。
相关文章:
- OpenMP阵列性能较差
- 如何将三维尺寸不固定的三维阵列展平为一维阵列
- 当我的阵列太大时出现分段错误
- 位阵列上的快速AND运算
- 阵列必须使用大括号封闭的初始器进行初始化
- 没有从阵列<float>到阵列<int>的可行转换
- C++动态安全 2D 交错阵列
- 堆栈问题(平衡表达式问题集)
- 将平面阵列重塑为复杂的特征类型
- 如何使用英特尔 PIN 捕获阵列的所有负载?
- 为什么我能够为阵列分配比计算机实际拥有的内存更多的内存
- 库特<<恩德尔;不适用于打印 2D 阵列
- 数组类 阵列的打印输出
- 从较小的阵列到较大的阵列的元素级转换
- 仅在大型阵列上出现合并排序分段错误
- 编写了一个C++代码来检查表达式是否具有平衡括号并且我的代码未运行.我已经卡了一天了
- 从阵列C++中删除重复项
- 二叉树结构平衡,使用递归时EXC_BAD_ACCESS
- 阵列的大小在C++中是否灵活?
- 如果我们可以将特定数组元件增加/减少1,则最小总移动到平衡阵列