二分算法-寻找指定和的整数对
输入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()