k个成对元素的差的最小和

时间:2013-10-19 14:42:36

标签: c++ algorithm

我想计算大小为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。

1 个答案:

答案 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;;
}