原題**:
在三元組(a, b, c),要求a <= b <= c。
結果不能包含重複的三元組。
您在真實的面試中是否遇到過這個題? 是
(-1, 0, 1)
(-1, -1, 2)
標籤排序
兩根指標
陣列思路:
不考慮時間複雜度、空間複雜度的話,三重迴圈暴力破解,唉,菜鳥第一想法。找到一組答案後判斷下是否與result中已有組合重複,這個判重可以單獨定義成乙個函式。
ac**:
classsolution
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……暴力破解反而通過?費解
classsolution
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...