57 三數之和

2022-05-12 02:23:08 字數 1272 閱讀 3086

原題**:

在三元組(a, b, c),要求a <= b <= c。

結果不能包含重複的三元組。

您在真實的面試中是否遇到過這個題?  是

(-1, 0, 1)

(-1, -1, 2)

標籤排序

兩根指標

陣列思路:

不考慮時間複雜度、空間複雜度的話,三重迴圈暴力破解,唉,菜鳥第一想法。找到一組答案後判斷下是否與result中已有組合重複,這個判重可以單獨定義成乙個函式。

ac**:

class

solution

else

}if(caninsert)}}

}}

}return

result;

}bool same(vector num1,vectornum2)

}return

true;}

};

優化演算法:  參考  與 

最開始我也是順著兩數之和的思路,先固定乙個索引,另外兩個數用雜湊表,但會造成重複問題,並且會漏檢一些組合,比如有多種組合nums【j】+ nums【k】= target的情況,只能檢測出一種。

網上看了別人的答案後醍醐灌頂,膜拜大神。

詳細見上面鏈結,簡單說來就是先排序,然後固定乙個數i,再用兩個指標一根從頭(i+1)一根從尾(n-1)遍歷餘下的元素,如果三個數的和等於0,push到結果中。如果和大於0,尾指標前移(減小總體和)。反之如果和小於0,頭指標後移(增大總體和)。

這裡尤其注意去除重複,因為陣列已經排過序,只需要判斷i,j,k三根指標是否與上乙個指向元素相同就可以了。

**,lintcode說我 time limit exceeded,emmmm……暴力破解反而通過?費解

class

solution

if (i>0&&numbers[i]==numbers[i-1])//

去除重複;

int j=i+1,k=n-1

;

while(jif (k1&&numbers[k]==numbers[k+1])//

去除重複;

if (numbers[i]+numbers[j]+numbers[k]==0

)

else

if (numbers[i]+numbers[j]+numbers[k]>0

)

else}}

return

result;

}};

57 三數之和

57.三數之和 給出乙個有n個整數的陣列s,在s中找到三個整數a,b,c,找到所有使得a b c 0的三元組。樣例如s 你需要返回的三元組集合的是 1,0,1 1,1,2 注意事項 在三元組 a,b,c 要求a b c。結果不能包含重複的三元組。class solution 57 int b i 1...

領扣LintCode問題答案 57 三數之和

領扣lintcode問題答案 57.三數之和 給出乙個有n個整數的陣列s,在s中找到三個整數a,b,c,找到所有使得a b c 0的三元組。在三元組 a,b,c 要求a b c。結果不能包含重複的三元組。樣例 1 輸入 2,7,11,15 輸出 樣例 2 輸入 1,0,1,2,1,4 輸出 1,0,...

兩數之和,三數之和

兩數之和 方法一 暴力 throw new illegalargumentexception 時間複雜度 o n 2 空間複雜度 o 1 public int twosum int nums,int target throw newillegalargumentexception no twosum...