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

题目描述

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

运行结果

相关推荐
Java爱好狂.17 小时前
阿里1658页Java面试题总结(含答案)
java·后端·高并发·架构师·java面试·java面试题·java八股文
啊啊啊啊啊!!!!17 小时前
【c++】⽤哈希表封装myunordered_map和myunordered_set
数据结构·哈希算法·散列表
Thanks_ks17 小时前
从 0.1+0.2 不等于 0.3 说起:聊聊浮点数精度问题
java·python·数值计算·精度丢失·bigdecimal·浮点数·ieee754
(●—●)橘子……17 小时前
力扣 第525场周赛 练习理解
数据结构·python·学习·算法·leetcode
Tt有了t17 小时前
Redis的数据结构
数据结构·数据库·redis
海鸥-w17 小时前
区域名称同步存储实现笔记
java·笔记
Rain的Java大神之路17 小时前
LeetCode 21 合并两个有序链表:一道 Easy 题,凭什么刷掉一半候选人?
java·后端·算法
小白的码BUG之路17 小时前
K8S -- 集群搭建环境基础
java·服务器·kubernetes
w_t_y_y17 小时前
JWT(5)JWT+spring security
java·后端·spring
小蒋观天下17 小时前
太阳能低功耗AI相机专项:AOV值守、唤醒时序、ISP启停时序BUG
深度学习·数码相机·算法·机器学习