力扣-三数之和

1.问题

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

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

示例:

给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]

2.说明

输入说明:

首先输入n,表示输入n个整数

输入n个数组nums

输出说明:

输出所有能使得a+b+c=0的三个数的三元组

3.范例

输入范例:

6

-1 0 1 2 -1 -4

输出范例:

-1 0 -1

-1 -1 2

4.思路

使用双指针法进行解题,首先对数组进行排序

使用一层for循环,i遍历数组,当nums[i] >0时,后面的两个数和nums[i]相加一定也是>0,后面可以不再进行计算,因此直接返回reslut

同时定义下标left=i+1,right=nums.size()-1,即三元组nums[i] + nums[left] + nums[right]>0时,说明三数之和大于0,因排过序,因此,right往前移动,right--, 同理,若<0时,left++,直至left=right相遇为止

注意:题目中存在重复的元素,对于nums[i]==nums[i-1] 时,后面所计算的left和right同计算nums[i-1]的结果是一样的,因此需要进行去重!!!而且对a和b和c都需要进行去重!!!

5.代码

#include <iostream>
#include <stdio.h>
#include <algalgorithm>
#include <vector>
class Solution
{
public: vector
<vector<int>> treeSum(vector<int> &nums) { vector<vector<int>> result; sort(nums.begin(),nums.end()); for(int i=0;i<nums.size();i++) { if(nums[i]>0) return result; //对a进行去重 if(i>0&&nums[i]==nums[i-1]) continue; int left=i+1; int right=nums.size()-1; while(left<right) { if(nums[i]+nums[left]+nums[right]>0) right--; else if(nums[i]+nums[left]+nums[right]<0) left++; else { result.push_back(vector<int>{nums[i],nums[left],nums[right]}); //去重逻辑应该放在找到一个三元组之后,对b 和 c去重 while(right>left&&nums[right]==nums[right-1]) right--; while(right>left&&nums[left]==nums[left+1]) left++; //找到答案时,双指针同时收缩 right--; left++; } } } return result; } }; int main() { //三数之和 int n; cin>>n; vector<int> nums; int data; for(int i=0;i<n;i++) { cin>>data; nums.push_back(data); } vector<vector<int>> res=Solution().treeSum(nums); for(int i=0;i<res.size();i++) { for(int j=0;j<3;j++) { cout<<res[i][j]<<" "; } cout<<endl; } return 0; }

 

posted @ 2023-09-24 17:17  摆烂卧底  阅读(55)  评论(0)    收藏  举报