- 论坛徽章:
- 0
|
10可用积分
这些天华为那个使两个数组差最小的题,让我很郁闷,自己钻了牛角尖,总想找个快速有效的算法,最终发现没有。看了一下别人的代码发现这个问题直接置换就行,其实自己也想过这个算法但是没有仔细想,总感觉应该有更有效的算法,自己还要修炼啊,做到论语里的“耳顺”啊。
下面是我把网友的代码整理后修改得到的,比较简洁,而且style也好了不少。希望大家写代码能超过我的code style,哈哈。
#include <cmath>
void EqualizeArray( int * A, int * B, int count )
{
int sum_A = 0;
for ( int m = 0; m < count; m++ )
sum_A += A[m];
int sum_B = 0;
for ( int n = 0; n < count; n++)
sum_B += B[n];
int diff_AB = sum_A - sum_B;
for ( int i = 0; diff_AB && i < count; i++ )
{
for ( int j = 0; diff_AB && j < count; j++ )
{
int diff = A - B[j];
if ( abs( diff_AB - 2 * diff ) < abs( diff_AB ) )
{
int tmp = A;
A = B[j];
B[j] = tmp;
diff_AB -= 2 * diff;
}
}
}
}
int main( int argc, char *argv[] )
{
int A[3] = { 9, 8, 7 };
int B[3] = { 5, 4, 3 };
EqualizeArray( A, B, 3 );
return 0;
} |
|