初步了解K sum問題

2021-07-09 06:13:55 字數 797 閱讀 2118

給定一組數字a[n], 乙個常數(比如 int target) ,要求在這一堆數裡面找到k個數字,使得這k個數字的和等於target。

注意這一組數字可能有重複項:比如 1 1 2 3 , 求3sum, 然後 target  = 6, 你搜的時候可能會得到 兩組1 2 3, 1 2 3,1 來自第乙個1或者第二個1, 但是結果其實只有一組,所以最後結果要去重。

排序,這個演算法可以考慮最簡單的case, 2sum,這是個經典問題,方法就是先排序,然後利用頭尾指標找到兩個數使得他們的和,由於找數的過程是線性的,所以複雜度是排序的複雜度。

同樣的,3個數字就是 先取出乙個數,只要在剩下的數字裡面找到兩個數字使得他們的和等於(target – 那個取出的數)就可以了,這樣退化為2個數的問題。 利用這個思路k-sum問題能做到o(n^(k-1))複雜度

下面是兩個數的核心**:

#include //找到a[i]+a[j] = sum,先排序,再利用下面的演算法處理,時間複雜度是排序的複雜度。

int main()

; int i, j;

int sum = -1;

i = 0;

j = 5;

while (isum)

else

}printf("%d, %d", i, j);

return 0;

}

利用hash表查詢為常數級時間的特性,我們不需要排序,給定sum,sum=a[i]+a[j],我們只需要找到sum-a[i]的值在hash表中是否存在就行了。這樣時間複雜度就是線性的。

k sum類似問題總結

方法一 暴力,就是列舉所有的k subset,那麼這樣的複雜度就是 從n選出k個,複雜度是o n k 方法二 排序,這個演算法可以考慮最簡單的case,2sum,這是個經典問題,方法就是先排序,然後利用頭尾指標找到兩個數使得他們的和等於target,這個2sum演算法網上一搜就有,這裡不贅述了,給出...

C Boost 初步了解

boost是由c 標準委員會成員發起 眾多c 業界高人參與設計並實現的乙個涉及面廣 質量高且業已廣泛使用的c 標準後備庫,其中 tr1已經被納入c 0x標準庫。不論從風格和內容組織上講,都可以認為boost專案是c 標準庫的延伸。截止到boost 1.43版本,boost專案擁有大約100個用途廣泛...

jquery 初步了解

js 建立函式有以下三種方法 1 函式關鍵字 function foo x 2 匿名函式 var func function x 3 建構函式 var func new function x alert x 建構函式每次執行時都解析函式主題 頻繁呼叫建構函式效率很低 並且建構函式不能遞迴使用 關鍵字...