Leetcode Sum一類題目

2021-06-27 14:14:48 字數 2202 閱讀 4849

leetcode裡有一類這樣的題目,給定乙個陣列和乙個target值,尋找陣列中的幾個數相加等於target值。

1、two sum,尋找陣列中兩個數相加等於target值

2、three sum,尋找陣列中三個數相加等於target值

3、four sum,,尋找陣列中四個數相加等於target值

注:three sum和four sum都是two sum問題的延生

4、尋找任意幾個數相加等於target值,注:這裡面的陣列元素都必須都大於0,否則時間複雜度過大(高手可以計算一下)

接下來我們來一一分析各種情況

1、two sum,尋找陣列中兩個數相加等於target值。

解題思路:最簡單直接的是暴利兩層迴圈方法,其時間複雜度為o(n^2),優化解決two sum問題,把時間複雜度降低到o(nlogn),可以使用map,sort等方法,各位可以自己嘗試一下,這裡主要使用sort來解決問題:

如果把輸入陣列排序,那麼要找到2個數a , b滿足 a + b = target。只需要分別指向陣列的開頭i和結尾j,觀察開頭和結尾的和,如果兩數之和比target小,則說明需要將開頭向中間移動一步,如果兩數之和比target大,則說明需要將結尾向中間移動一步,如果兩數之和和target一樣,則找到了滿足條件的兩個數,將它存起來,然後繼續下一步比較(因為可能有不止乙個答案),繼續下一步比較的辦法是把開頭i和結尾j同時向中間移動一步。持續這個過程直到開頭i和結尾j相遇。

注意:如果陣列為,target為3,則如果不採取排重措施將會使結果為,},顯然這不是我們想要的結果我們想要的結果僅僅是},在**中加上排重**即可進行排重。

vector> twosum(vector&num, int target)

if (r != size - 1 && num[r] == num[r + 1])

sum = num[l] + num[r];

if (sum == target)

else if (sum < target)

++l;

else

--r;

} return result;

}

2、three sum

如果用暴力搜尋,3sum問題的時間複雜度為o(n³)借助解決2sum問題的思路,可以優化解決3sum問題。只需要在2sum的搜尋過程外層增加一層迴圈即可,時間複雜度為o(n²),為什麼為o(n^2),three sum的sort排序複雜度沒有變還是為o(nlogn),其尋找答案時間複雜度變成了o(n^2),所有最終時間複雜度還是為o(n^2)。

vector> threesum(vector&num) 

if (r != num.size() - 1 && num[r] == num[r + 1])

int tmp_sum = num[l] + num[r];

if (tmp_sum < two_sum)

++l;

else if (tmp_sum > two_sum)

--r;

else}}

return result;

}

3、four sum

模擬解決3sum問題過程,也可以優化解決4sum問題。只需要在2sum過程外層增加2層迴圈,時間複雜度為o(n³)。

vector> foursum(vector&num, int target) 

if (r != size - 1 && num[r] == num[r + 1])

sum = sumsub + num[r] + num[l];

if (sum == target)

else if (sum > target)

--r;

else

++l;}}

}return result;

}

4、尋找任意幾個數相加等於target值

解題思路:沒有限定選取數字的個數,一般使用dfs方法

class solution 

void getpath(vector&cand, int i, int size, int target, int sum)

else if (sum > target)

else

sum -= cand[j];}}

};

一類凸包題目(未完)

注 黑書 p392中有講 對於通常求的凸包,輸出的凸包是包括所有可能的共線點還是不包括任何共線點 即只有極點 這是取決於題目的題目要求的。在下面的程式中都會將去共線點的 加上,視題目刪除。1 簡單凸包,求凸包的周長和圓周 graham scan 演算法 include include include...

物件導向(一) 類

class class nameobject name 乙個或者幾個物件的標識 class crectanglerect 是crectangle型別的物件的名稱 crectangle 和 rect的關係就像 int 和變數a的物件一樣 int 型別名 a 物件名,變數 如果物件需要呼叫類裡面的函式,...

一 類與物件

物件的儲存細節 程式啟動,先把程式載入到 區。系統自動建立乙個類物件,載入類中的物件方法列表。當通過乙個類建立物件時,先在堆中開闢一塊儲存空間給物件p,再初始化物件的各屬性為0,最後返回乙個位址儲存到棧中 區域性變數接收 物件的第0個屬性是系統建立的isa指標,指向建立該物件的類。類方法只能類呼叫,...