方法一: 暴力,就是列舉所有的k-subset, 那麼這樣的複雜度就是 從n選出k個,複雜度是o(n^k)
方法二: 排序,這個演算法可以考慮最簡單的case, 2sum,這是個經典問題,方法就是先排序,然後利用頭尾指標找到兩個數使得他們的和等於target, 這個2sum演算法網上一搜就有,這裡不贅述了,給出2sum的核心**:
int i = starting; //頭指標
int j = num.size() - 1; //尾指標
while(i < j)
else if(sum < target)
++i;
else
--j;
}
這裡講兩點,第一,注意比如3sum的時候,先整體排一次序,然後列舉第三個數字的時候不需要重複, 比如排好序以後的數字是 a b c d e f, 那麼第一次列舉a, 在剩下的b c d e f中進行2 sum, 完了以後第二次列舉b, 只需要在 c d e f中進行2sum好了,而不是在a c d e f中進行2sum, 這個大家可以自己體會一下,想通了還是挺有幫助的。第二,k sum可以寫乙個遞迴程式很優雅的解決,具體大家可以自己試一試。寫遞迴的時候注意不要重複排序就行了。
其實比如2sum還是有線性解法的,就是用hashmap, 這樣你check某個值存在不存在就是常數時間,那麼給定乙個sum, 只要線性掃瞄, 對每乙個number判斷sum – num存在不存在就可以了。注意這個演算法對有重複元素的序列也是適用的。比如 2 3 3 4 那麼hashtable可以使 hash(2) = 1; hash(3) = 1, hash(4) =1其他都是0, 那麼check的時候,掃到兩次3都是check sum – 3在不在hashtable中,注意最後返回所有符合的pair的時候也還是要去重。這樣子推廣的話 3sum 其實也有o(n^2)的類似hash演算法,這點和之前是沒有提高的,但是4sum就會有更快的乙個演算法。
o(n^2)把所有pair存入hash表,並且每個hash值下面可以跟乙個list做成map, map[hashvalue] = list,每個list中的元素就是乙個pair, 這個pair的和就是這個hash值,那麼接下來求4sum就變成了在所有的pair value中求 2sum,這個就成了線性演算法了,注意這裡的線性又是針對pair數量(n^2)的線性,所以整體上這個演算法是o(n^2),而且因為我們掛了list, 所以只要符合4sum的我們都可以找到對應的是哪四個數字。
數字反轉 逆序數等類似問題
將乙個數反轉,前導零不輸出,不改變正負性。input 輸入共一行,乙個整數noutput 輸出共一行,表示反轉後的整數。sample input 380sample output 83hint 對於100 的資料,10 10 n 10 10source 第三屆海潤杯上海第二工業大學新生程式設計競賽注...
二分查詢,以及類似問題
關鍵點 二分查詢的最終步驟會經歷2個元素,1個元素,0個元素的階段,利用這幾個階段確定最終的下標。題目 在乙個有序陣列中查詢某個元素的比較序列 偽 binary search a,e p 0,r a.length 1while p r m p r 2 if a m e r m 1else if a ...
初步了解K sum問題
給定一組數字a n 乙個常數 比如 int target 要求在這一堆數裡面找到k個數字,使得這k個數字的和等於target。注意這一組數字可能有重複項 比如 1 1 2 3 求3sum,然後 target 6,你搜的時候可能會得到 兩組1 2 3,1 2 3,1 來自第乙個1或者第二個1,但是結果...