二分演算法 尋找指定和的整數對

2022-03-24 07:44:38 字數 1483 閱讀 3476

輸入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

deffindpair(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...