二分算法-寻找指定和的整数对

输入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()

 

 
posted @ 2020-04-20 10:14  StudyNLP  阅读(448)  评论(0编辑  收藏  举报