LeetCode 15. 3Sum

Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Notice that the solution set must not contain duplicate triplets.

Example 1:

Input: nums = [-1,0,1,2,-1,-4]
Output: [[-1,-1,2],[-1,0,1]]

Example 2:

Input: nums = []
Output: []

Example 3:

Input: nums = [0]
Output: []

Constraints:

0 <= nums.length <= 3000
-105 <= nums[i] <= 105

实现思路:

经典的双指针问题中的求和问题,基本方法就是for循环固定一个数,然后定义两个指针一个指向当前数的下一个,另一个指针指向最后一个数,将三数之和相加判断是否为0,不过要注意重复答案的去除方法,就像是窗口滑动一样,滑动前后元素值相等的元素来去重。

AC代码:

class Solution {
	public:
		vector<vector<int>> threeSum(vector<int>& nums) {
			vector<vector<int>> ans;
			if(nums.size()==0) return ans;
			sort(nums.begin(),nums.end());
			for(int i=0; i<nums.size(); i++) {//固定第一个数 然后遍历j、k指针
				if(i>0&&nums[i]==nums[i-1]) continue;
				int j=i+1;
				int k=nums.size()-1;
				while(j<k) {
					if(nums[i]+nums[j]+nums[k]==0) {
						ans.push_back({nums[i],nums[j],nums[k]});
						j++;//移动j指针
						k--;//移动k指针
						while(j<k&&nums[j]==nums[j-1]) j++;//如果是j指针前后数值一样忽略
						while(j<k&&nums[k]==nums[k+1]) k--;////如果是k指针前后数值一样忽略
					} else if(nums[i]+nums[j]+nums[k]<0) {
						j++;//如果三数之和小于0了说明j指针需要扩大
					} else k--;
				}
			}
			return ans;
		}
};
posted @ 2021-03-08 20:26  coderJ_ONE  阅读(30)  评论(0编辑  收藏  举报