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()
     
  • 相关阅读:
    ARP投毒攻击
    sniffer简单使用
    MAC泛洪攻击
    又是一题反序列化了解一下???
    关于parse_str变量覆盖分析
    超级ping(多线程版)
    文本输入框input将输入转换为统一大小写
    通俗易懂JSONP讲解
    通俗易懂JSONP讲解
    Fastjson主要接口和类库说明
  • 原文地址:https://www.cnblogs.com/an-wl/p/12736173.html
Copyright © 2011-2022 走看看