【算法Hot100系列】三数之和

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

  • 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
    • 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

一.题目描述

1.题目信息

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

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

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

2.题目地址

三数之和

3.测试示例

示例 1:

复制代码
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

示例 2:

复制代码
输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

示例 3:

复制代码
输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

4.提示信息

提示:

  • 3 <= nums.length <= 3000
  • -105 <= nums[i] <= 105

二.题解

1.双指针

java 复制代码
public List<List<Integer>> threeSum(int[] nums) {
    List<List<Integer>> ans = new ArrayList<>();
    if (nums == null || nums.length < 3) {
        return ans;
    }
    Arrays.sort(nums);
    for (int i = 0; i < nums.length; i++) {
        if (nums[i] > 0) {
            break;
        }
        if (i > 0 && nums[i] == nums[i - 1]) {
            continue;
        }
        int left = i + 1;
        int right = nums.length - 1;
        while (left < right) {
            int sum = nums[i] + nums[left] + nums[right];
            if (sum == 0) {
                ans.add(new ArrayList<>(Arrays.asList(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--;
            } else if (sum > 0) {
                right--;
            } else {
                left++;
            }
        }
    }
    return ans;
}

2.解题思路

  1. 先对数组排序,遍历数组
  2. 当前遍历的值大于 0,结束循环,因为最小的都大于 0 了,一定不会有满足条件的数据了
  3. 如果当前值和下一个值相等,则略过当前值,为了避免重复结果集
  4. 使用双指针,左指针是 i 的下一个元素,右指针是最后一个元素
  5. 当找到满足条件的数据时,还需要继续遍历,看看是否还有满足条件的数据

3.注意事项

  • 双指针
  • 注意排序
  • 注意边界条件
  • 注意找到 sum=0 时,内部还有满足条件的数据

三.自我分析

1.解题思路

apl 复制代码
if 有思路
    开写
else
    去看相关标签,确定具体解题方法
    if 有思路
        开写
    else
        看提示信息
        if 有思路
            开写
        else
            看答案

2.思考链路

  • 没有思路
  • 多做,多思考
  • 形成自己的肌肉记忆
  • 多多调试
  • 多总结
  • 多回头看看以前的题目,温故而知新

觉得有用的话点个赞 👍🏻 呗。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

相关推荐
551只玄猫5 分钟前
KNN算法基础 机器学习基础1 python人工智能
人工智能·python·算法·机器学习·机器学习算法·knn·knn算法
charliejohn5 分钟前
计算机考研 408 数据结构 哈夫曼
数据结构·考研·算法
POLITE313 分钟前
Leetcode 41.缺失的第一个正数 JavaScript (Day 7)
javascript·算法·leetcode
CodeAmaz27 分钟前
一致性哈希与Redis哈希槽详解
redis·算法·哈希算法
POLITE31 小时前
Leetcode 42.接雨水 JavaScript (Day 3)
javascript·算法·leetcode
Tim_101 小时前
【算法专题训练】36、前缀树路径和
算法
好易学·数据结构1 小时前
可视化图解算法76:最大子数组和
数据结构·算法·leetcode·面试·动态规划·力扣·笔试
副露のmagic1 小时前
更弱智的算法学习 day13
学习·算法
青岛少儿编程-王老师2 小时前
CCF编程能力等级认证GESP—C++1级—20251227
java·c++·算法