您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页三数之和(C++解法)

三数之和(C++解法)

来源:华佗小知识

题目

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != 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 。

C++代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

/*
* 排序+双指针解决三数之和问题
* 设置三个指针嵌套循环,设置枚举数不同
* 如果second+third所在数大于target,third-1
* 直到返回三数之和为0的三个数字
*/
vector<vector<int>> threeSum(vector<int>& nums) {
	int n = nums.size();
	sort(nums.begin(), nums.end());
	vector<vector<int>> ans;

	for (int first = 0; first < n; ++first) {
		if (first > 0 && nums[first] == nums[first - 1]) {
			continue;
		}
		int target = -nums[first];
		int third = n - 1;
		for (int second = first + 1; second < n; ++second) {
			if (second > first + 1 && nums[second] == nums[second - 1]) {
				continue;
			}
			while (second < third && nums[second] + nums[third] > target) {
				--third;
			}
			if (second == third) {
				break;
			}
			if (nums[second] + nums[third] == target) {
				ans.push_back({ nums[first], nums[second], nums[third] });
			}
		}
	}
	return ans;
}

int main() {
	vector<int> nums = { -1, 0,1,2,-1,-4 };
	vector<vector<int>> ans = threeSum(nums);
	for (int i = 0; i < ans.size(); ++i) {
		for (int j = 0; j < ans[i].size(); ++j) {
			cout << ans[i][j] << " ";
		}
	}
	return 0;
}

分析

排序+双指针解决三数之和问题,设置三个指针 first, second, third 嵌套循环,设置枚举数不同,如果 second + third 所在数大于 target,third-1,循环直到返回三数之和为 0 的三个数字。

问题

输出 vector<vector<int>> 数组,需要嵌套循环,其中 j 小于第 i 行的列数。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务