Leetcode 15 三數之和

2021-09-25 06:33:10 字數 1648 閱讀 2006

題目介紹:

給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。

注意:答案中不可以包含重複的三元組。

例如, 給定陣列 nums = [-1, 0, 1, 2, -1, -4],

滿足要求的三元組集合為:

[[-1, 0, 1],

[-1, -1, 2]

]1.暴力求解

使用3個for迴圈,找到所有相加等於零的vector,然後對每乙個vector做乙個sort後再判斷是否相等,相等則erase

#include #include #include using namespace std;

//3個for迴圈,找到所有相加等於零的vector之後對每乙個vector做乙個排序然後判斷是否相等,erase掉相同的元素

class solution

; solution a;

vector> result = a.threesum(b);

for(int i=0; i2.對輸入的數字先做乙個排序,對負數部分進行迴圈, 看其後面的兩數相加是否能與它抵消,當然如果第乙個數就是正數就是無解的輸入 。在計算後面兩數的和的時候我們可以設兩個迭代器, 乙個從這個數後第乙個數開始,乙個從最後乙個數開始, 如果加和小了就移動第乙個迭代器,如果加和大了就移動第二個迭代器,就可以遍歷所有情況了。 而且因為數字整個都是排序的,如果有重複數字肯定是相鄰的, 我們在處理完前乙個數之後,如果後乙個數與之相等就刪掉,這樣避免了重複情況的出現。

#include #include #include using namespace std;

/*對輸入的數字先做乙個排序,對負數部分進行迴圈,

* 看其後面的兩數相加是否能與它抵消,當然如果第乙個數就是正數就是無解的輸入

* 在計算後面兩數的和的時候我們可以設兩個迭代器,

* 乙個從這個數後第乙個數開始,乙個從最後乙個數開始,

* 如果加和小了就移動第乙個迭代器,如果加和大了就移動第二個迭代器,就可以遍歷所有情況了。

* 而且因為數字整個都是排序的,如果有重複數字肯定是相鄰的,

* 我們在處理完前乙個數之後,如果後乙個數與之相等就刪掉,這樣避免了重複情況的出現。

*/class solution

); /*因為數字整個都是排序的,如果有重複數字肯定是相鄰的,我們在處理完前乙個數之後,如果後乙個數與之相等就刪掉,這樣避免了重複情況的出現。*/

while(i < j && nums[i] == nums[i+1]) ++i;

while(i < j && nums[j] == nums[j-1]) --i;

++i;

--j;

}else if(nums[i] + nums[j] < target) ++i;

else --j;}}

return res;

}};int main()

; solution a;

vector> result = a.threesum(b);

for(int i=0; icout << "}" << endl;

}return 0;

}

LeetCode 15 三數之和

15.給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組 方法一,個人解法正確,但是效率太低,時間複雜度o n 3 時間超時,無法提交至leetcode public s...

leetcode 15 三數之和

給定乙個包含 n 個整數的陣列nums,判斷nums中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。例如,給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 class solutio...

leetcode15 三數之和

給定乙個包含 n 個整數的陣列nums,判斷nums中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。例如,給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 先找兩數之和,然後再用un...