題目介紹:
給定乙個包含 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...