LeetCode15

ops/2025/3/1 15:29:52/

LeetCode15

目录

  • 题目描述
  • 示例
  • 思路分析
  • 代码段
  • 代码逐行讲解
  • 复杂度分析
  • 总结的知识点
  • 整合
  • 总结

题目描述

给你一个整数数组 nums,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != kj != k,同时还满足 nums[i] + nums[j] + nums[k] == 0。请你返回所有和为 0 且不重复的三元组。

注意:

  • 答案中不可以包含重复的三元组。

示例

示例 1

输入:

nums = [-1, 0, 1, 2, -1, -4]

输出:

[[-1, -1, 2],[-1, 0, 1]
]

解释:

  • 三元组 [-1, -1, 2] 的和为 0。
  • 三元组 [-1, 0, 1] 的和为 0。

示例 2

输入:

nums = [0, 1, 1]

输出:

[]

解释:

  • 唯一可能的三元组 [0, 1, 1] 的和不为 0。

示例 3

输入:

nums = [0, 0, 0]

输出:

[[0, 0, 0]
]

解释:

  • 唯一可能的三元组 [0, 0, 0] 的和为 0。

思路分析

问题核心

我们需要找到所有不重复的三元组,使得它们的和为 0。

思路拆解

  1. 排序
    • 将数组排序,方便后续的双指针操作。
  2. 遍历数组
    • 固定一个数 nums[i],然后在剩余部分使用双指针寻找两个数 nums[left]nums[right],使得 nums[i] + nums[left] + nums[right] == 0
  3. 去重
    • 如果 nums[i] 与前一个数相同,则跳过,避免重复。
    • 在找到满足条件的三元组后,跳过重复的 nums[left]nums[right]
  4. 双指针
    • 如果 sum > 0,则右指针左移。
    • 如果 sum < 0,则左指针右移。
    • 如果 sum == 0,则记录结果并移动指针。

代码段

class Solution {public List<List<Integer>> threeSum(int[] nums) {Arrays.sort(nums);List<List<Integer>> ans = new ArrayList<>();for (int i = 0; i < nums.length; i++) {if (nums[i] > 0) {return ans;}if (i > 0 && nums[i] == nums[i - 1]) {continue;}int left = i + 1;int right = nums.length - 1;while (right > left) {int sum = nums[i] + nums[left] + nums[right];if (sum > 0) {right--;} else if (sum < 0) {left++;} else {ans.add(Arrays.asList(nums[i], nums[left], nums[right]));while (right > left && nums[right] == nums[right - 1]) right--;while (right > left && nums[left] == nums[left + 1]) left++;right--;left++;}}}return ans;}
}

在这里插入图片描述


代码逐行讲解

  1. 排序数组

    • 将数组排序,方便后续的双指针操作。
  2. 初始化结果列表

    • 用于存储所有满足条件的三元组。
  3. 遍历数组

    • 固定一个数 nums[i],然后在剩余部分使用双指针寻找两个数 nums[left]nums[right]
  4. 剪枝

    • 如果当前数大于 0,则直接返回结果,因为后续的数都大于 0,无法满足和为 0。
  5. 去重

    • 如果当前数与前一个数相同,则跳过,避免重复。
  6. 初始化双指针

    • left 指向 i + 1right 指向数组末尾。
  7. 双指针遍历

    • 当右指针大于左指针时,继续遍历。
  8. 计算和

    • 计算当前三元组的和。
  9. 调整指针

    • 如果 sum > 0,则右指针左移。
    • 如果 sum < 0,则左指针右移。
    • 如果 sum == 0,则记录结果并跳过重复的 nums[left]nums[right]
  10. 返回结果

    • 返回所有满足条件的三元组。

复杂度分析

时间复杂度

  • 排序的时间复杂度为 O(n log n)
  • 双指针遍历的时间复杂度为 O(n^2)
  • 因此,总时间复杂度为 O(n^2)

空间复杂度

  • 排序的空间复杂度为 O(log n)
  • 结果列表的空间复杂度为 O(n^2)

总结的知识点

  1. 排序

    • 使用 Arrays.sort 对数组进行排序。
  2. 双指针

    • 使用双指针在有序数组中寻找满足条件的两个数。
  3. 去重

    • 通过跳过重复的元素,避免生成重复的三元组。
  4. 剪枝

    • 通过提前终止循环,减少不必要的计算。

整合

class Solution {public List<List<Integer>> threeSum(int[] nums) {Arrays.sort(nums);List<List<Integer>> ans = new ArrayList<>();for (int i = 0; i < nums.length; i++) {if (nums[i] > 0) {return ans;}if (i > 0 && nums[i] == nums[i - 1]) {continue;}int left = i + 1;int right = nums.length - 1;while (right > left) {int sum = nums[i] + nums[left] + nums[right];if (sum > 0) {right--;} else if (sum < 0) {left++;} else {ans.add(Arrays.asList(nums[i], nums[left], nums[right]));while (right > left && nums[right] == nums[right - 1]) right--;while (right > left && nums[left] == nums[left + 1]) left++;right--;left++;}}}return ans;}
}

总结

通过排序和双指针,能够高效地找到所有和为 0 的三元组。


http://www.ppmy.cn/ops/162261.html

相关文章

随身wifi wps是什么?(Wi-Fi Protected Setup)一种简化无线网络连接的技术,允许用户无需手动输入密码即可快速连接设备

文章目录 **WPS的核心功能**1. **快速连接方式**&#xff1a;2. **适用场景**&#xff1a; **使用步骤&#xff08;以华为随行WiFi为例&#xff09;****安全风险与建议****支持WPS的设备示例** 好了&#xff0c;让我们解决这个关于便携式 Wi-Fi 设备中 WPS 的问题。首先&#x…

2.8作业

1 /*message.php代码*/访问message.php传参&#xff0c;m&#xff0c;s&#xff0c;f <?php class message{public $tokenadmin; } $m new message(); echo base64_encode(serialize($m)); ?> 2 reserve2 offset flag求原flag 49那里第一遍写错了&#xff08;没有…

Springboot各版本与Java JDK的对应关系及JDK商用版本

Spring Boot各版本对应的 JDK 如下&#xff1a; Spring Boot 2.5.x&#xff1a;-> JDK 16 及以上版本。 Spring Boot 2.4.x&#xff1a;-> JDK 11 及以上版本。 Spring Boot 2.3.x&#xff1a;-> JDK 8 及以上版本&#xff0c;建议使用 JDK 11 及以上版本。 Spring B…

【重磅发布】AllData数据中台核心功能:湖仓一体化平台

&#x1f525;&#x1f525; AllData大数据产品是可定义数据中台&#xff0c;以数据平台为底座&#xff0c;以数据中台为桥梁&#xff0c;以机器学习平台为中层框架&#xff0c;以大模型应用为上游产品&#xff0c;提供全链路数字化解决方案。 ✨奥零数据科技官网&#xff1a;…

计算机毕业设计Python+DeepSeek-R1大模型考研院校推荐系统 考研分数线预测 考研推荐系统 考研(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

活在AI原生时代的05后,开始用AI创业

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 人工智能&AIGC术语100条 Shelly聊AI-重…

windows配置永久路由

前言 在实际应用场景中&#xff0c;遇到了这样一个需求&#xff0c;高斯数据库在生产内网中&#xff0c;我们使用nginx将高斯数据库服务代理出来&#xff0c;并且配置了ip限制&#xff0c;只能使用公司的外网ip进行访问&#xff0c;由于连接上公司VPN以后并不能成功访问数据库…

NIM平台开发基于提示工程的大语言模型(LLM)应用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1 课程介绍1.1 Goals1.2 content 2 提示词简介2.1 NVIDIA NIMs 用于提示工程2.2 OpenAI API 交互2.3 与 LangChain 交互实现聊天2.4 流式处理和批处理2.5 迭代式提示…