zoukankan      html  css  js  c++  java
  • 二分算法-寻找指定和的整数对

    输入n ( n<= 100,000)个整数,找出其中的两个数,它们之和等于整数m(假定肯定有解)。
    题中所有整数都能用 int 表示

    解法1:用两重循环,枚举所有的取数方法,复杂度是O(n 2 )的。
    for(int i = 0;i < n-1; ++i)
    for(int j = i + 1; j < n; ++j)
    if( a[i]+a[j] == m)
    break;
    100,000 2 = 100亿,在各种OJ上提交或参加各种程序设计竞赛,这样的复杂度都会超时!

    方法2:
    1.将数组排序,复杂度是 O(n×log(n))
    2.对数组中的每个元素 a[i],在数组中二分查找 m-a[i],看能否找到。
    复杂度 log(n),最坏要查找 n-2 次,所以查找这部分的复杂度也是O(n×log(n))

    方法3:
    1.将数组排序,复杂度是 O(n×log(n))
    2.查找的时候,设置两个变量 i 和 j,i 初值是0,j 初值是 n-1,
    看 a[i]+a[j],如果大于 m,就让 j 减1,如果小于 m,就让 i 加1,直至 a[i]+a[j]=m。


    Python代码实现:
     1 def findPair(dataList,i,j,sum):
     2     while True:
     3         if dataList[i] + dataList[j] == sum:
     4             break;
     5         if dataList[i] + dataList[j] < sum:
     6             i += 1;
     7             continue;
     8         if dataList[i] + dataList[j] > sum:
     9             j -= 1;
    10             continue;
    11     return i,j
    12 
    13 
    14 # 2,4,6,1,0,8,10,3,5,12,14,16,18
    15 def main():
    16     data = list(map(int,input("请输入整数,逗号分隔:").split(",")))
    17     #print("请输入寻找指定和的值:",end="")
    18     sum = int(input("请输入寻找指定和的值:"))
    19     data.sort()
    20     i, j = 0, len(data)-1
    21     i,j = findPair(data, i, j,sum)
    22     print("整数对为:%d,%d"%(data[i],data[j]))
    23 
    24 if __name__ == "__main__":
    25     main()
     
  • 相关阅读:
    asp.net点击按钮下载图片而不是打开图片
    在事务中调用WebService一定程度上实现数据同步
    C#自定义Attribute的定义和获取简例
    开发ASP.NET下的MP3小偷程序
    Ajax 中XmlHttp 乱码 的解决方法 (UTF8,GB2312 编码 解码)
    MasterPage 类
    怎样成为优秀的软件测试员
    标准日本语动词大全
    什么是WSDL?
    ASP.NET程序中常用的三十三种代码
  • 原文地址:https://www.cnblogs.com/an-wl/p/12736173.html
Copyright © 2011-2022 走看看