【发布时间】:2013-10-19 14:42:36
【问题描述】:
我想计算一个大小为 n 且 k
例如:n = 7 k = 3 10 100 300 200 1000 20 30
我将首先对数字进行排序。 10 20 30 100 200 300 1000 根据我的算法: n!=k 所以首先我会取 10 20 30: 这意味着 diff = 40 像这样继续下去,40 是我得到的最小值。
我想知道是否有比这更好的方法:
这是我的算法:
if(n!=k)
{
for(i = 0 ;i < n - k;i++)
{
diff = 0;
l = 0;
for(j = i;j < i + k;j++)
{
diff += (a[j] * l - a[j] *(k-l-1));
if(min < diff)
break;
l++;
}
if(j == i + k && diff > 0)
min = diff;
//cout<<"after: "<<min<<endl;
}
}
else
{
if(k == 1)
min = a[0];
else
{
diff = 0;
for(i = n - 1; i >= 0; i--)
{
diff+=a[i]*i - a[i]*(n-i-1);
}
min = diff;
}
}
cout<<min<<endl;
类似这个问题:Finding sum of Absolute Difference of Every pair of integer from an array
不是每一对,取决于 k。
【问题讨论】:
-
请更具体地说明“绝对差异总和”的含义。究竟有什么区别?成对不同的元素?
diff += (a[j] * l - a[j] *(k-l-1))不是一个绝对的和,也不清楚你拿的是什么区别。 -
真的很抱歉。是的,我的意思是成对不同的元素。数组已排序。所以 diff 不会是负数。所以对于 6 3 1 2 4 是数组,排序后它将是 1 2 3 4 6。如果 k = 3 那么 (2 - 1) + (3 - 1) + (3 - 2) = 4
-
如果你希望别人改进你的代码,你需要解释它。例如,您需要显示算法的推导。 (您在幕后进行了一些重要的代数操作以提出
a[j] * i - a[j] * (k-i-1),有人会认为他们使用了与您相同的秘密代数公式,然后意识到它与您的k=1的代码不匹配并假设他们猜到了不正确。)此外,改进已经运行的代码的建议属于 codereview.stackexchange.com,而不是 stackoverflow.com。 -
我做了一些修改。我希望现在很清楚,
-
为了更好地适应问答模型,我建议您将您的方法与问题分开并将其发布为答案(如果没有人提出更好的解决方案,您可以接受)(并且最好用高级描述和/或伪代码添加/替换它,并做一个完整的例子,而不是说“像这样继续”)。除非您希望人们对您的代码提出改进建议(而不是完全不同的方法),在这种情况下,这属于 Code Review。