mysql 两元组的差值_找元组中差值最大最小个数

给定一个整数数组,计算所有可能的两元组之间的差值,并找出差值最小和最大的对数。文章提供了两种不同的算法实现,分别通过排序差值数组和在遍历过程中实时更新最大最小值计数来解决问题。
摘要由CSDN通过智能技术生成

题目:有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; i

{

for(int j=i+1; j

{

if(ar[i]>ar[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<

cout<

cout<

if(vec[0] != vec[size-1])

{

int min = 0, max = 0;

int i = 0;

while(vec[i] == *vec.begin())

{++min;++i;}

i = size-1;

while(vec[i] == vec[size-1])

{++max; --i;}

br[0] = min;

br[1] = max;

return;

}

br[0] = size;

br[1] = size;

return;

}

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<

return 0;

}

运行结果

647f3a7f9ba1615dc0f59182ddcda862.png

因该还有更好地思路来节省空间时间

于是我换了一种思路,在每次拿到差值的时候就比较它是不是最大或最小值,是就计数,不是就跳过得到下面的算法

#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; i

{

if(!i)

min = ((ar[0]-ar[1])>0 ? ar[0]-ar[1] : ar[1]-ar[0]);

for(int j=i+1; j

{

tmp = ar[i]-ar[j];

if(tmp<0)

tmp = -tmp;

if(tmp

else if(tmp==min){++minc;continue;}

else if(tmp>max){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<

return 0;

}

执行结果

3699fa0ef44a56f7620e7d1cd94869d8.png

看起来节省了空间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值