题目:有n个数,两两组成二元组,相差最小的有多少对呢?相差最大呢?
例如 ar[] = {1,3,4,9},返回 1 1
br[] = {1,2,3,10,12,21},返回 2 1
我的思路是将元素两两做差,将差值保存在一个数组内,把数组进行排序,即可找出最小差值多少个,最大差值多少个。(看起来我的时间空间复杂度低不了)
#include
#include
#include
using namespace std;
void func(int n, int ar[], int br[])
{
int size = (n*n-n)/2;
vector vec;
for(int i=0; iar[j])
vec.push_back(ar[i]-ar[j]);
else
vec.push_back(ar[j]-ar[i]);
}
}
sort(vec.begin(), vec.end());
for(auto i=vec.begin(); i!=vec.end(); ++i)
cout<<*i<<" ";
cout<
运行结果
因该还有更好地思路来节省空间时间
于是我换了一种思路,在每次拿到差值的时候就比较它是不是最大或最小值,是就计数,不是就跳过得到下面的算法
#include
#include
#include
using namespace std;
void func(int n, int ar[], int br[])
{
int min = -1, max = -1, maxc = 0, minc = 0, tmp = 0;
for(int i=0; i0 ? ar[0]-ar[1] : ar[1]-ar[0]);
for(int j=i+1; jmax){max=tmp;maxc=1;continue;}
else if(tmp==max){++maxc;continue;}
else continue;
}
}
br[0]=minc;
br[1]=maxc;
}
int main()
{
int ar[] = {1,2,3,4,5,6,7,8,9,0,234, -132, 354325, 52354, 123}, br[2]={0};
func(sizeof(ar)/sizeof(ar[0]), ar, br);
cout<
执行结果
看起来节省了空间