当前位置: 首页 > news >正文

LeetCode 15.三数之和

三数之和

问题描述

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

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

解决思路

这个问题可以通过先将数组排序,然后使用双指针来解决。具体解决步骤如下:

  1. 首先对数组 nums 进行排序,以便后续双指针的操作。

  2. 初始化一个空列表 res 用于存储符合条件的三元组。

  3. 使用外层循环遍历数组 nums,将当前元素设为 nums[first]

  4. 在内层循环中,使用双指针 secondthird 来寻找满足条件的三元组。secondfirst 的下一个位置开始,third 从数组的最后一个位置开始。

  5. 在内层循环中,首先判断是否需要跳过重复的元素,即如果 second > first + 1 并且 nums[second] == nums[second-1],则跳过当前元素。

  6. 在内层循环中,使用 target 变量表示目标值,即 target = -nums[first]

  7. 使用 while 循环来不断调整 secondthird 指针,使它们向中间靠拢,直到找到一个满足条件的三元组或者 second == third 时结束。

  8. 如果找到一个满足条件的三元组,将其添加到结果列表 res 中。

  9. 继续外层循环,重复上述步骤,直到遍历完整个数组。

  10. 返回结果列表 res

代码实现

以下是使用Python编写的代码,实现了上述解决思路,并添加了注释以解释每个步骤:

class Solution:def threeSum(self, nums):n = len(nums)nums.sort()  # 对数组进行排序res = []  # 存储结果的列表for first in range(n):if first > 0 and nums[first] == nums[first - 1]:  # 跳过重复的元素continuethird = n - 1  # 初始化第三个指针target = -nums[first]  # 计算目标值for second in range(first + 1, n):if second > first + 1 and nums[second] == nums[second - 1]:  # 跳过重复的元素continuewhile second < third and nums[second] + nums[third] > target:  # 调整第二个和第三个指针third -= 1if second == third:breakif nums[second] + nums[third] == target:  # 找到满足条件的三元组res.append([nums[first], nums[second], nums[third]])return res  # 返回结果列表

复杂度分析

  • 时间复杂度: O(N^2),其中N是数组nums的长度。

  • 空间复杂度: O(log N)。我们忽略了存储答案的空间,额外的排序操作空间复杂度为O(log N)。但需要注意的是,由于我们修改了输入数组nums,在实际情况下可能不允许这种操作。因此,也可以将其看作是使用了一个额外的数组来存储nums的副本并进行排序,这样空间复杂度为O(N)。

结论

三数之和问题是一个经典的双指针问题,通过使用双指针方法,我们可以高效地找到满足条件的三元组。这个算法的时间复杂度和空间复杂度都在合理范围内,适用于大多数情况。希望这篇博客能够帮助你更好地理解和解决这个问题。

http://www.lryc.cn/news/182684.html

相关文章:

  • Linux实用操作(固定IP、进程控制、监控、文件解压缩)
  • Redis高可用之哨兵模式、集群
  • Python数据攻略-DataFrame的创建与基础特性
  • 【word】从正文开始设置页码
  • 计算机网络 快速了解网络层次、常用协议、常见物理设备。 掌握程序员必备网络基础知识!!!
  • CUDA 安装
  • Springboot+vue的在线试题题库管理系统(有报告),Javaee项目,springboot vue前后端分离项目。
  • 【简单的留言墙】HTML+CSS+JavaScript
  • linux 火狐浏览器报错Firefox is already running, but is not responding
  • Python:操作SQLite数据库简单示例
  • 第8期ThreadX视频教程:应用实战,将裸机工程移植到RTOS的任务划分,驱动和应用层交互,中断DMA,C库和中间件处理等注意事项
  • 【NeurIPS 2023】Backdoor对抗攻防论文汇总
  • (Note)在Excel中选中某一行至最后一行的快捷键操作
  • 古记事法:Windows 下 16 位汇编环境搭建指南(DOSBox-X 篇)
  • 云计算基础:理解AWS、Azure和Google Cloud
  • 【数据结构初阶】七、非线性表里的二叉树(堆的实现 -- C语言顺序结构)
  • 基于SpringBoot的网上超市系统
  • 在springboot项目中整合Druid
  • 微信支付费率降低到0.2%,商家收款开户手续费0.6%降低的操作方法
  • 计算机毕业设计 基于SSM的民宿推荐系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • 【机器学习】训练集/验证集/测试集释疑
  • LCR 120.寻找文件副本
  • 代码随想录算法训练营第44天|动态规划:完全背包理论基础、518.零钱兑换II、377. 组合总和 Ⅳ
  • 309.买卖股票的最佳时机含冷冻期【Java】
  • React Promise 中断
  • 1.填空题 进制转换Oct.2023
  • node 解决多版本配置 error:03000086:digital 引起的问题 已解决
  • 前端面试题: js中对比两个对象的值是否相等? for..in 和 for...of的区别?
  • 第十七章:Java连接数据库jdbc(java和myql数据库连接)
  • Unity基于种子与地块概率的开放世界2D地图生成