我想计算大小为n且k <= n的数组中k个元素的差异的最小和。 我做的是: 1.按升序对元素进行排序 2.如果n!= k,那么我执行了一个操作 3.否则,如果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。
答案 0 :(得分:0)
我不确定我是否正确理解你的问题,但它似乎与链接相同,但你可以通过值传递给不同k值的函数,它将根据传入的k值对向量进行排序见下文。
#include <vector>
#include <iostream>
#include <algorithm>
int absDiffSum( std::vector<int> v, int k )
{
std::sort(v.begin(), v.begin() + k);
int n=(v.begin() + k) - v.begin();
if ( n < 2 )
return 0;
int sum = 0;
for ( int i = 0; i < n; ++i )
{
int k = n - i - 1;
sum+=(v[i]*i - v[i]*k);
}
return sum;
}
int main ()
{
std::vector<int> v = { 2, 3, 5, 7 };
std::cout << (3-2) + (5-2) + (7-2) + (5-3) + (7-3) + (7-5) << std::endl;
std::cout << absDiffSum( v, 4 ) << std::endl;;
std::cout << (3-2) + (5-2) + (5-3) << std::endl;
std::cout << absDiffSum( v, 3 ) << std::endl;;
std::cout << (3-2) << std::endl;
std::cout << absDiffSum( v, 2 ) << std::endl;;
}