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


    先求差值最大的:

    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)

  • 相关阅读:
    HDU1255覆盖的面积
    B. An express train to reveries
    Long Long Message(后缀数组)
    Longest Common Substring(最长公共子序列)
    最长上升子序列(NlogN)总结
    bzoj 1500 维修数列
    HDU 6357 Hills And Valleys
    牛客暑假多校第六场 I Team Rocket
    HDU 6346 整数规划 二分图匹配最优解
    牛客暑假多校第五场 I vcd
  • 原文地址:https://www.cnblogs.com/juandx/p/4065470.html
Copyright © 2020-2023  润新知