給定一組數字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 建構函式每次執行時都解析函式主題 頻繁呼叫建構函式效率很低 並且建構函式不能遞迴使用 關鍵字...