Leecode热题100---15:三数之和为零

题目:

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。

请你返回所有和为 0 且不重复的三元组。

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

C++:

双指针法:

cpp 复制代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class Solution {
public:
	vector<vector<int>> threeSum(vector<int>& nums) {
		int n = nums.size();
		sort(nums.begin(), nums.end()); // 对数组进行排序,以便后续操作
		vector<vector<int>> answer; // 存储结果的二维向量

		for (int i = 0; i < n; i++) { // 遍历数组,固定第一个元素
			// 避免重复的固定元素
			if (i > 0 && nums[i] == nums[i - 1])
				continue;

			int left = i + 1; // 左指针指向固定元素的下一位
			int right = n - 1; // 右指针指向数组末尾

			while (left < right) {
				int sum = nums[i] + nums[left] + nums[right]; // 计算三个元素的和

				if (sum < 0) { // 如果和小于零,说明需要增大和,左指针右移一位
					left++;
				}
				else if (sum > 0) { // 如果和大于零,说明需要减小和,右指针左移一位
					right--;
				}
				else { // 和等于零,找到满足条件的三元组
					answer.push_back(vector<int>{ nums[i], nums[left], nums[right] }); // 将三元组添加到结果中
					cout << nums[i], nums[left], nums[right];

					// 避免重复的左指针元素
					while (left < right && nums[left] == nums[left + 1])
						left++;
					// 避免重复的右指针元素
					while (left < right && nums[right] == nums[right - 1])
						right--;

					left++; // 左指针右移一位
					right--; // 右指针左移一位
				}
			}
		}
		return answer;
	}
};

int main()
{
	Solution S;
	vector<int> nums = { -1, 0, 1, 2, -1, -4 };
	vector<vector<int>> answers = S.threeSum(nums);
}

python:

思路:先排序,然后两边向中间靠拢。

python 复制代码
class Solution():
    def threeSum(self,nums):
        nums.sort()  # 排序
        res = []
        for i in range(len(nums)):  # 遍历每一个数
            if i==0 or nums[i] > nums[i-1]:  # 确定不重复的数字(开头)
                l = i+1
                r = len(nums)-1
                while l<r:
                    s = nums[i] + nums[l] + nums[r]
                    if s == 0:
                        res.append([nums[i],nums[l],nums[r]])
                        l += 1
                        r -= 1
                        # 左边向右移动到不重复数为止
                        while l<r and nums[l] == nums[l-1] :
                            l += 1
                        # 右边向左边移动不重复数为止
                        while l<r and nums[r] == nums[r+1] :
                            r -= 1
                    elif s >0:
                        r -= 1
                    else:
                        l += 1
        return res
相关推荐
Cx330❀2 分钟前
【优选算法必刷100题】第43题(模拟):数青蛙
c++·算法·leetcode·面试
杜子不疼.3 分钟前
【LeetCode30_滑动窗口 + 哈希表】:三招搞定“串联所有单词的子串”
数据结构·算法·哈希算法
闻缺陷则喜何志丹3 分钟前
【C++动态规划 状压dp】1879. 两个数组最小的异或值之和|2145
c++·算法·动态规划·力扣·数组·最小·动态规范
艾莉丝努力练剑8 分钟前
【优选算法必刷100题:专题五】(位运算算法)第033~38题:判断字符是否唯一、丢失的数字、两整数之和、只出现一次的数字 II、消失的两个数字
java·大数据·运维·c++·人工智能·算法·位运算
光羽隹衡8 分钟前
机器学习——DBSCAN算法
人工智能·算法·机器学习
vyuvyucd8 分钟前
Java数组与Arrays类实战指南
数据结构·算法
csuzhucong8 分钟前
七彩鹦鹉螺魔方
算法
逝川长叹9 分钟前
利用 SSI-COV 算法自动识别线状结构在环境振动下的模态参数研究(Matlab代码实现)
前端·算法·支持向量机·matlab
山上三树9 分钟前
详细介绍 C 语言中的匿名结构体
c语言·开发语言·算法
EXtreme3510 分钟前
【数据结构】彻底搞懂二叉树:四种遍历逻辑、经典OJ题与递归性能全解析
c语言·数据结构·算法·二叉树·递归