题目给你一个整数数组 nums 判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k 同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。注意答案中不可以包含重复的三元组。示例 1输入nums [-1,0,1,2,-1,-4]输出[[-1,-1,2],[-1,0,1]]解释nums[0] nums[1] nums[2] (-1) 0 1 0 。nums[1] nums[2] nums[4] 0 1 (-1) 0 。nums[0] nums[3] nums[4] (-1) 2 (-1) 0 。不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。注意输出的顺序和三元组的顺序并不重要。示例 2输入nums [0,1,1]输出[]解释唯一可能的三元组和不为 0 。示例 3输入nums [0,0,0]输出[[0,0,0]]解释唯一可能的三元组和为 0 。思路这题使用排序双指针法需要注意去重。首先排序外层指针从前到后开始逐个遍历num不同的元素目的去重遍历的时候内层使用头尾指针寻找和为-num的值如果遍历到了存进res并且移动头指针到下一个不同的元素上目的去重记得条件要加上lr代码classSolution{public:vectorvectorintthreeSum(vectorintnums){// 不好使用hash使用排序双指针sort(nums.begin(),nums.end());vectorvectorintres;for(inti0;inums.size();i){intsum2-nums[i];intli1,rnums.size()-1;if(i0nums[i-1]!nums[i]||i0){while(lr){if(nums[l]nums[r]sum2){res.push_back({nums[i],nums[l],nums[r]});l;while(nums[l]nums[l-1]lr){l;}}elseif(nums[l]nums[r]sum2){l;}else{r--;}}}}returnres;}};感谢 感谢华南溜达虎 力扣blind 75自己用hash琢磨半天双指针两下就出来了不如双指针一根。
15 三数之和
题目给你一个整数数组 nums 判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k 同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。注意答案中不可以包含重复的三元组。示例 1输入nums [-1,0,1,2,-1,-4]输出[[-1,-1,2],[-1,0,1]]解释nums[0] nums[1] nums[2] (-1) 0 1 0 。nums[1] nums[2] nums[4] 0 1 (-1) 0 。nums[0] nums[3] nums[4] (-1) 2 (-1) 0 。不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。注意输出的顺序和三元组的顺序并不重要。示例 2输入nums [0,1,1]输出[]解释唯一可能的三元组和不为 0 。示例 3输入nums [0,0,0]输出[[0,0,0]]解释唯一可能的三元组和为 0 。思路这题使用排序双指针法需要注意去重。首先排序外层指针从前到后开始逐个遍历num不同的元素目的去重遍历的时候内层使用头尾指针寻找和为-num的值如果遍历到了存进res并且移动头指针到下一个不同的元素上目的去重记得条件要加上lr代码classSolution{public:vectorvectorintthreeSum(vectorintnums){// 不好使用hash使用排序双指针sort(nums.begin(),nums.end());vectorvectorintres;for(inti0;inums.size();i){intsum2-nums[i];intli1,rnums.size()-1;if(i0nums[i-1]!nums[i]||i0){while(lr){if(nums[l]nums[r]sum2){res.push_back({nums[i],nums[l],nums[r]});l;while(nums[l]nums[l-1]lr){l;}}elseif(nums[l]nums[r]sum2){l;}else{r--;}}}}returnres;}};感谢 感谢华南溜达虎 力扣blind 75自己用hash琢磨半天双指针两下就出来了不如双指针一根。