数组中相加和为0的三元组——NC.54

本文介绍如何使用双指针算法解决数组中三元素之和等于零的问题,通过排序和特殊判断避免重复结果。关键步骤包括排序数组、遍历并用两个指针寻找和为零的组合,同时注意去重。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

给出一个有n个元素的数组S,S中是否有元素a,b,c满足a+b+c=0?找出数组S中所有满足条件的三元组。 注意:
三元组(a、b、c)中的元素必须按非降序排列。(即a≤b≤c) 解集中不能包含重复的三元组。 例如,给定的数组 S = {-10 0 10
20 -10 -40},解集为(-10, 0, 10) (-10, -10, 20)

解题思路:三个数相加,可以转化为两个数相加的场景。解决这类数组问题,可以先对数组进行排序,这样相当于多了一个隐含条件。

遍历数组中的每个数据,然后使用双指针寻找其它数据中符合要求的两个数。这样就转换成了两个数相加的问题。

为了避免结果重复,需要注意以下两处:

  • 对于固定的数据,如果后面有和前一个数据相等的值,则要跳过。
  • 在找到一组结果后,要判断left处和left + 1处是否相等,相等则就重复,应该使left++
import java.util.*;

public class Solution {
    public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<>();
        Arrays.sort(num);
        // 遍历每隔数,寻找其它两数和该数相加,转换位两数相加问题
        for(int i = 0; i < num.length; i++) {
            if (i == 0 || num[i] != num[i - 1]) { // 避免重复
                int left = i + 1;
                int right = num.length - 1;
                while (left < right) {
                    while (left < right && num[i] + num[left] + num[right] > 0){
                        right--;
                    }
                    if (left < right && num[i] + num[left] + num[right] == 0) {
                        ArrayList<Integer> temp = new ArrayList<Integer>();
                        temp.add(num[i]);
                        temp.add(num[left]);
                        temp.add(num[right]);
                        res.add(temp);
                        int curLeft = num[left];
                        while (left < right && num[left] == curLeft) left++; // 去掉重复的
                    } else {
                        left++;
                    }
                }
            }
        }
        return res;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值