在一个数组中找 差值最大的两个数 差值最小的两个数 推广到 点对

先求差值最大的:

1、找出最大值和最小值 然后做差,  每次比较相邻的两个数(比如先0,1  然后2,3),然后每次比较记录下最大和最小的差值,可以比较1.5N次得到结果,和分为奇数偶数位比较一样的复杂度

2、由于抽屉原来,设最大的值和最小的值为maxV和minV,那么最大差值不会超过delta = (maxV-minV)/(N-1),  用反证法可以证明,编程之美p171,然后根据delta的值分为N个桶,最大差值显然不会再桶内,所以找到桶内最大的值和最小的值,即可。o(n)

 

如果是点对,那么 参考 凸包,卡壳算法。。。我还不会。。。http://blog.csdn.net/wangyangkobe/article/details/6081975

 

 

然后是差值最小的“

1、排序然后扫描相邻的,o(nlogn)

2、把所以值用visit数组标记,visit[a[i]] = 1,然后找到最相邻的两个1即可,bit貌似可以优化

 

点对:不能排序是个问题了。。。考虑编程之美p170算法,分治,分为左右两个部分,两边找出最小的,设最小的为mdin,然后再判断两个点一个在做一个在右的情况,只考虑分布<2*midn的情况,然后两个矩形。。。8个点(我怎么感觉是6个呢),然后再按照y排序找,每次找相邻8个点即可,这一步就是o(n)了,然后总的o(nlogn)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值