功能性的网站建设,黑彩网站怎么做,网站开发小工具,盘锦网站网站建设给你一个整数数组 nums #xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k #xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请
你返回所有和为 0 且不重复的三元组。
注意#xff1a;答案中不可以包含重复的三元组。
示例 …给你一个整数数组 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 。提示
3 nums.length 3000-105 nums[i] 105
题解
前有两数之和用哈希在O(n)的时间复杂度内解决现有三数之和需要用到双指针在O(n²)内解决
暴力的话需要三层循环而且需要去重复
我们可以先从小到大排序一下元素那么现在元素是有序的了而且左边的比右边的小或者相等
如果某元素大于0了那么这个元素后面是不会有答案出现了因为后面的元素不会比前面的小
找到一个小于等于0的元素了让左指针指向后面一个元素右指针指向最大的元素把他们相加起来如果和等于0那么这三个是一个答案存起来继续看左边的元素往右有没有相同的元素如果有的话更新一下左边指针因为这三个数字的组合已经是答案了相同的就是重复了然后同样看右边的元素往左有没有相同的元素有的话也更新一下
如果和不等于0和比0小那么移动左指针让候选元素变大如果和比0大那么移动右指针让候选元素变小
排序nlogn遍历元素n两层while循环因为循环条件都是一起的加起来也是n所以就是n²
class Solution {
public:vectorvectorint threeSum(vectorint nums) {if(nums.size()3)return {};sort(nums.begin(),nums.end());if(nums[0]0) // 如果最小的都大于0了那么肯定没有return {};vectorvectorintanswer;for(int i0;inums.size();i){if(i0nums[i]nums[i-1]) // 元素相同的不做判断continue;int lefti1,rightnums.size()-1; // 取左右双指针while(leftright){int sumnums[i]nums[left]nums[right];if(sum0){answer.push_back({nums[i],nums[left],nums[right]});while(leftrightnums[left]nums[left1]){left;} // 左边相同的去掉while(leftrightnums[right-1]nums[right]){right--;} // 右边相同的去掉left;right--;}else if(sum0){ // 和不为0但是小于0说明和太小了移动左指针变大left;} else{ // 移动右指针变小right--;}}}return answer;}
};