輸入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**實現:
1deffindpair(datalist,i,j,sum):
2while
true:
3if datalist[i] + datalist[j] ==sum:
4break;5
if datalist[i] + datalist[j] 6 i += 1;
7continue;8
if datalist[i] + datalist[j] >sum:
9 j -= 1;
10continue;11
return
i,j12
1314
#2,4,6,1,0,8,10,3,5,12,14,16,18
15def
main():
16 data = list(map(int,input("
請輸入整數,逗號分隔:
").split(","
)))17
#print("請輸入尋找指定和的值:",end="")
18 sum = int(input("
請輸入尋找指定和的值:"))
19data.sort()
20 i, j = 0, len(data)-1
21 i,j =findpair(data, i, j,sum)
22print("
整數對為:%d,%d
"%(data[i],data[j]))
2324
if__name__ == "
__main__":
25 main()
演算法實踐 尋找指定和的整數對(二分查詢,尺取法)
給出若干個整數,詢問其中是否有一對數的和等於給定的數。共三行 第一行是整數n 0 n 100,000 表示有n個整數。第二行是n個整數。整數的範圍是在0到10 8之間。第三行是乙個整數m 0 m 2 30 表示需要得到的和。若存在和為m的數對,輸出兩個整數,小的在前,大的在後,中間用單個空格隔開。若...
二分 整數二分和浮點數二分
一定是單調的才可以二分。找中間點 判斷是否滿足check函式 此函式需要自己根據題意調整,假設紅色區域為滿足check函式,說明mid在紅色區域內,此時要在mid到r之間找,l mid,否則r mid 1。由於此時l mid 所以中間點應為 l r 1 2 中間點mid l r 2 mid l r ...
演算法 整數二分(分巧克力)
兒童節那天有 k 位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友們。小明一共有 n 塊巧克力,其中第 i 塊是 hi wi 的方格組成的長方形。為了公平起見,小明需要從這 n 塊巧克力中切出 k 塊巧克力分給小朋友們。切出的巧克力需要滿足 形狀是正方形,邊長是整數 大小相同 例如一塊 6 5...