LeetCode第8题:三数之和

本文介绍了如何运用双指针算法解决数组中寻找三数之和为零的子集问题。通过排序输入数组,固定最小值,使用两个指针从两侧向中间移动,根据和的正负调整指针位置,有效避免重复并提高效率。示例展示了具体实现过程和代码细节。
摘要由CSDN通过智能技术生成

题目:
三数之和
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
一、算法介绍
本题采用双指针算法。双指针算法需要先将给定的输入数组进行排序,这样可以避免出现重复元素。

  • 解题思路:
    假设输入数组为n,数组长度为len;
    1)固定 3个指针中最左(最小)数字的指针 i,双指针 right,left 分设在数组索引 [i+1,len-1] 两端,通过双指针交替向中间移动,记录对于每个固定指针 i 的所有满足 nums[i] + nums[right] + nums[left] == 0 的right,left组合。
    2)如果 nums[i] + nums[right] + nums[left] =0,存储下这三个值,左右指针各向中间移一个位置。
    3)如果nums[i] + nums[right] + nums[left] <0,说明 nums[right]太小,left右移。
    4)如果nums[i] + nums[right] + nums[left] >0,说明 nums[right]太大,right 左移。
    【简单一句话,先固定第一个数a,然后b、c只能从两边向中间靠(在a之后)。细节条件就是去重处理】
    二、代码
package suanfa.三数之和_8;

import java.util.*;

public class Eight {
    public static void main(String[] args) {
        System.out.println(Eight.solution(new int[]{-1, 0, 1, 2, -1, -4}));
    }
    public static List<List<Integer>> solution(int[] n){
        Arrays.sort(n);
        int len = n.length;
        //可以去重复
        Set<List<Integer>> lists = new HashSet<>();
//        List<List<Integer>> lists = new ArrayList<>(); //会有重复元素
        for (int i = 0; i < len; i++) {
            int l = i + 1;
            int r = len - 1;
            while (l < r){
                if(n[i] + n[l] + n[r] == 0){
                    lists.add(Arrays.asList(n[i],n[l],n[r]));
                    l++;
                    r--;
                }else if(n[i] + n[l] + n[r] <= 0){
                    l++;
                }else {
                    r--;
                }
            }
        }
        List<List<Integer>> ans = new ArrayList<>();
        ans.addAll(lists);
        return ans;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值