(超级详细)算法刷题Leecode15. 三数之和

题目描述

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

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

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

源代码和其他算法题的源码已经上传代码仓库(开源),有兴趣的小伙伴可以去看一看,点点star喔,也可以提交自己对不同算法的看法喔!

代码仓库地址为::::这里时代码仓库的地址喔!!!!!!!!

代码实现(思路在注释里喔!)

java 复制代码
package my15;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class SuandFa15 {
    public List<List<Integer>> threeSum(int[] nums) {
        //第一步,先将代码排序,这样会提高代码的效率,因为题目要求三数和为0,我们知道当从小到大排序时,当三个数中最小的数
        //大于0的时候,不管怎么样都不会有结果是零的情况,将代码排序会方便我们判断。
        Arrays.sort(nums);
        //第二步,我们新建一个List集合存储所有最后结果为0的三个数。
        List<List<Integer>> its = new ArrayList<>();
        int length = nums.length;
        //第三步,我们可以将最左面的指针固定,其他两个指针作为双指针。
        //最左面的指针i使用for循环遍历,循环终止条件是i <= nums.length-2
        for (int i = 0; i < length-2; i++) {
            //当此时i指针对应的数据大于0时直接跳出循环,因为最左面的指针作为最小的指针,当nums[i]>0时,
            //其他的两个指针对应的索引均大于0,不符合条件nums[i] + nums[j] + nums[k] == 0
            if (nums[i] > 0){
                break;
            }
            //若下一次的i指针和当前i指针相同的话跳出当前循环。
            //同时需要注意当前的i指针要大于0也就是说第一次循环时不走这一个判断条件
            if (i >0 && nums[i] == nums[i-1]){
                continue;
            }
            //双指针的左右指针定
            int j = i+1;
            int k = length-1;

            while( j < k){
                int sum = nums[i] + nums[j] + nums[k];
                //当结果 == 0时
                if (sum == 0){
                    //添加进入数组中
                    its.add(new ArrayList<Integer>(Arrays.asList(nums[i], nums[j], nums[k])));
                    //判断下一次与该左右指针相同的跳出循环,并执行j++ ,k --
                    while(j < k && nums[j] == nums[j+1]){
                        j++;
                    }
                    j++;
                    while(j < k && nums[k] == nums[k-1]){
                        k--;
                    }
                    k--;
                }
                //当sum的值小于0时,说明当前的数还不够大所以需要将左指针向前移动一位,并且
                //当移动之前的值等于移动之后的值时,忽略这一次的值,并向前移动一位。
                if (sum < 0){

                    while(j < k && nums[j] == nums[j+1]){
                        j++;
                    }
                    j++;
                }
                //当sum的值大于0时,反之亦然
                if (sum > 0){
                    while(j < k && nums[k] == nums[k-1]){
                        k--;
                    }
                    k--;
                }
            }
        }
        return its;
    }

    public static void main(String[] args) {
        SuandFa15 suandFa15 = new SuandFa15();
        int[] suanfa15demo = {-1,0,1,2,-1,-4};
        suandFa15.threeSum(suanfa15demo);
    }
}

运行结果

相关推荐
ZC跨境爬虫2 分钟前
LeetCode 13. 罗马数字转整数(多解法详解 + Java Python 实现)
java·python·leetcode
省长7 分钟前
Sa-Token v1.46.0 发布 🚀,来看看有没有令你心动的功能!
java·后端·开源
.道阻且长.7 分钟前
10.LeetCode算法习题讲解--滑动窗口--最大连续为一的个数
算法·leetcode·职场和发展
LayZhangStrive32 分钟前
融360 一面
java·面试·后端开发
学习中.........42 分钟前
Karpathy nanoGPT 教程到底讲了什么
人工智能·算法·语言模型
城管不管1 小时前
重生——第十次面试之开源中国一面挂
java·linux·开发语言·算法·面试·职场和发展·开源
Java小白笔记1 小时前
Windows系统免软件命令激活
java·网络·人工智能·windows·ai·ai编程
爱敲键盘的猴子1 小时前
深入理解 Java HashMap
java·hashmap
霸道流氓气质1 小时前
Java开发者AI编程常用MCP、Skills、Rules全景汇总
java·开发语言·ai编程
天涯醉青楼1 小时前
Spring Boot 接口返回 Bean 时字段名“变形”的深度剖析与解决方案
java