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

02. [Python+Golang+PHP]三数之和,多种语言实现最优解demo

一、问题描述:三数之和

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

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

示例 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 。

提示:

  • 3 <= nums.length <= 3000
  • -105 <= nums[i] <= 10^{5}

二、实现方案

方案一:双指针法

方法思路:

  1. 排序数组:首先将数组排序,以便于后续处理重复元素和使用双指针法。
  2. 固定第一个元素:遍历数组中的每个元素作为三元组的第一个元素。
  3. 双指针查找:对于每个固定的第一个元素,使用双指针在剩余部分中查找另外两个元素,使得三数之和为 0。
  4. 跳过重复元素:在遍历和查找过程中,跳过重复的元素以避免生成重复的三元组。

复杂度:

  • 时间复杂度为 O(n²),
  • 空间复杂度为 O(1)(不考虑排序的空间),是解决此问题的最优方案。

代码实现:

  • Python
def threeSum(nums):nums.sort()res = []n = len(nums)for i in range(n - 2):# 跳过重复的第一个元素if i > 0 and nums[i] == nums[i - 1]:continueleft, right = i + 1, n - 1while left < right:total = nums[i] + nums[left] + nums[right]if total < 0:left += 1elif total > 0:right -= 1else:res.append([nums[i], nums[left], nums[right]])# 跳过左侧重复元素while left < right and nums[left] == nums[left + 1]:left += 1# 跳过右侧重复元素while left < right and nums[right] == nums[right - 1]:right -= 1# 移动指针以寻找下一个可能的三元组left += 1right -= 1return res
  •  php:
function threeSum($nums) {sort($nums); // 将数组排序$result = array();$n = count($nums);for ($i = 0; $i < $n - 2; $i++) {// 跳过重复的起始元素if ($i > 0 && $nums[$i] == $nums[$i - 1]) {continue;}$left = $i + 1;$right = $n - 1;$target = -$nums[$i]; // 转化为两数之和问题:nums[left] + nums[right] = targetwhile ($left < $right) {$sum = $nums[$left] + $nums[$right];if ($sum == $target) {// 找到有效组合,加入结果array_push($result, array($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--;} elseif ($sum < $target) {$left++; // 和太小,左指针右移} else {$right--; // 和太大,右指针左移}}}return $result;
}
  •  golang:
package mainimport ("fmt""sort"
)func threeSum(nums []int) [][]int {sort.Ints(nums) // 先排序var result [][]intn := len(nums)for i := 0; i < n-2; i++ {// 跳过重复的第一个元素if i > 0 && nums[i] == nums[i-1] {continue}left, right := i+1, n-1target := -nums[i] // 转化为两数之和问题for left < right {sum := nums[left] + nums[right]if sum == target {// 找到有效组合result = append(result, []int{nums[i], nums[left], nums[right]})// 跳过左侧重复元素for left < right && nums[left] == nums[left+1] {left++}// 跳过右侧重复元素for left < right && nums[right] == nums[right-1] {right--}// 移动指针寻找下一个可能left++right--} else if sum < target {left++ // 和太小,左指针右移} else {right-- // 和太大,右指针左移}}}return result
}## 测试实例
func main() {// 示例 1nums1 := []int{-1, 0, 1, 2, -1, -4}fmt.Println(threeSum(nums1)) // 输出:[[-1 -1 2] [-1 0 1]]// 示例 2nums2 := []int{0, 1, 1}fmt.Println(threeSum(nums2)) // 输出:[]// 示例 3nums3 := []int{0, 0, 0}fmt.Println(threeSum(nums3)) // 输出:[[0 0 0]]
}

方案二:暴力法(三重循环)

复杂度:

  • 时间复杂度:O(n³),适用于极小的数据量,但在题目约束下会超时。

代码实现:

  • Python:
def threeSumBruteForce(nums):res = []nums.sort()n = len(nums)for i in range(n-2):if i > 0 and nums[i] == nums[i-1]:continuefor j in range(i+1, n-1):if j > i+1 and nums[j] == nums[j-1]:continuefor k in range(j+1, n):if k > j+1 and nums[k] == nums[k-1]:continueif nums[i] + nums[j] + nums[k] == 0:res.append([nums[i], nums[j], nums[k]])return res
  • PHP:
function threeSumBruteForce($nums) {sort($nums);$result = array();$n = count($nums);for ($i = 0; $i < $n - 2; $i++) {if ($i > 0 && $nums[$i] == $nums[$i-1]) continue;for ($j = $i+1; $j < $n - 1; $j++) {if ($j > $i+1 && $nums[$j] == $nums[$j-1]) continue;for ($k = $j+1; $k < $n; $k++) {if ($k > $j+1 && $nums[$k] == $nums[$k-1]) continue;if ($nums[$i] + $nums[$j] + $nums[$k] == 0) {array_push($result, [$nums[$i], $nums[$j], $nums[$k]]);}}}}return $result;
}
  •  Golang:
func threeSumBruteForce(nums []int) [][]int {sort.Ints(nums)var result [][]intn := len(nums)for i := 0; i < n-2; i++ {if i > 0 && nums[i] == nums[i-1] {continue}for j := i + 1; j < n-1; j++ {if j > i+1 && nums[j] == nums[j-1] {continue}for k := j + 1; k < n; k++ {if k > j+1 && nums[k] == nums[k-1] {continue}if nums[i]+nums[j]+nums[k] == 0 {result = append(result, []int{nums[i], nums[j], nums[k]})}}}}return result
}

方案三:哈希表法

复杂度:

  • 时间复杂度:O(n²),但哈希表操作常数较大,实际效率可能不如双指针法。

代码示例

  • python:
def threeSumHash(nums):res = []nums.sort()n = len(nums)for i in range(n - 2):if i > 0 and nums[i] == nums[i - 1]:continueseen = set()target = -nums[i]j = i + 1while j < n:complement = target - nums[j]if complement in seen:res.append([nums[i], complement, nums[j]])while j + 1 < n and nums[j] == nums[j + 1]:j += 1seen.add(nums[j])j += 1return res
  •  php:
function threeSumHash($nums) {sort($nums);$result = array();$n = count($nums);for ($i = 0; $i < $n - 2; $i++) {if ($i > 0 && $nums[$i] == $nums[$i-1]) continue;$seen = array();$target = -$nums[$i];for ($j = $i + 1; $j < $n; $j++) {$complement = $target - $nums[$j];if (in_array($complement, $seen)) {array_push($result, [$nums[$i], $complement, $nums[$j]]);while ($j + 1 < $n && $nums[$j] == $nums[$j+1]) $j++;}array_push($seen, $nums[$j]);}}return $result;
}
  •  Golang:
func threeSumHash(nums []int) [][]int {sort.Ints(nums)var result [][]intn := len(nums)for i := 0; i < n-2; i++ {if i > 0 && nums[i] == nums[i-1] {continue}seen := make(map[int]bool)target := -nums[i]for j := i + 1; j < n; j++ {complement := target - nums[j]if seen[complement] {result = append(result, []int{nums[i], complement, nums[j]})// 跳过重复的jfor j+1 < n && nums[j] == nums[j+1] {j++}}seen[nums[j]] = true}}return result
}

三、效率对比

  • 双指针法:最优解,时间复杂度 O(n²),空间复杂度 O(1)(排序的辅助空间可忽略),适用于大规模数据。
  • 哈希表法:同样时间复杂度 O(n²),但实际运行效率较低,且处理重复元素逻辑复杂。
  • 暴力法:仅适用于极小数据量,实际不可行。

相关文章:

02. [Python+Golang+PHP]三数之和,多种语言实现最优解demo

一、问题描述&#xff1a;三数之和 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中…...

MongoDB选择理由

1.简介 MongoDB是一个基于分布式文件存储的数据库由C语言编写&#xff0c;旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据库的。Mongo最大的特点是…...

倚光科技在二元衍射面加工技术上的革新:引领光学元件制造新方向​

倚光科技二元衍射面加工技术&#xff08;呈现出细腻的光碟反射纹路&#xff09; 在光学元件制造领域&#xff0c;二元衍射面的加工技术一直是行业发展的关键驱动力之一。其精准的光相位调制能力&#xff0c;在诸多前沿光学应用中扮演着不可或缺的角色。然而&#xff0c;长期以来…...

驱动开发(2)|鲁班猫rk3568简单GPIO波形操控

上篇文章写了如何下载内核源码、编译源码的详细步骤&#xff0c;以及一个简单的官方demo编译&#xff0c;今天分享一下如何根据板子的引脚写自己控制GPIO进行高低电平反转。 想要控制GPIO之前要学会看自己的引脚分布图&#xff0c;我用的是鲁班猫RK3568&#xff0c;引脚分布图如…...

《软件工程》第 3 章 -需求工程概论

在软件工程的开发流程中&#xff0c;需求工程是奠定项目成功基础的关键环节。它专注于获取、分析、定义和管理软件需求&#xff0c;确保开发出的软件能真正满足用户需求。接下来&#xff0c;我们将按照目录内容&#xff0c;结合 Java 代码和实际案例&#xff0c;深入讲解需求工…...

VMware-MySQL主从

MySQL主从 服务器信息 服务器类型角色主机地址主机名称虚拟机master192.168.40.128test-1虚拟机slave192.168.40.129test-2 Master 配置&#xff08;192.168.40.128&#xff09; 删除自动生成的配置 /var/lib/mysql/auto.cnf [roottest-1 ~]# rm -rf /var/lib/mysql/auto.…...

ArcGIS Pro 3.4 二次开发 - 几何

环境:ArcGIS Pro SDK 3.4 + .NET 8 文章目录 几何1 空间参考1.1 从已知ID构建空间参考1.2 从字符串构建空间参考1.3 使用 WGS84 空间参考1.4 使用已知ID构建带有垂直坐标系的空间参考1.5 使用垂直坐标系从字符串构建SpatialReference1.6 使用自定义投影坐标系(PCS)构建空间参…...

2023-ICLR-ReAct 首次结合Thought和Action提升大模型解决问题的能力

关于普林斯顿大学和Google Research, Brain Team合作的一篇文章, 在语言模型中协同Reasoning推理和Action行动。 论文地址&#xff1a;https://arxiv.org/abs/2210.03629 代码&#xff1a;https://github.com/ysymyth/ReAct.git 其他复现 langchain &#xff1a;https://pytho…...

Rust 开发的一些GUI库

最近考虑用Rust干点什么&#xff0c;于是搜集了下资料——根据2025年最新调研结果和社区实践&#xff0c;Rust GUI库生态已形成多个成熟度不同的解决方案。以下是当前主流的GUI库分类及特点分析&#xff0c;结合跨平台支持、开发体验和实际应用场景进行综合评估&#xff1a; 一…...

【第四十六周】文献阅读:从 RAG 到记忆:大型语言模型的非参数持续学习

目录 摘要Abstract从 RAG 到记忆&#xff1a;大型语言模型的非参数持续学习研究背景方法论1. 离线索引&#xff08;Offline Indexing&#xff09;2. 在线检索&#xff08;Online Retrieval&#xff09;具体细节 创新性实验结果局限性总结 摘要 本论文旨在解决当前检索增强生成…...

从智能提效到产品赋能的架构实践

摘要 本文深入探讨了企业级系统从智能化提效阶段向产品赋能阶段演进的架构实践路径。通过分析传统架构的局限性,提出了以用户价值为导向的现代化架构设计理念,并结合实际案例展示了如何构建可扩展、高可用、智能化的产品架构体系。 1. 引言 在数字化转型的浪潮中,企业技术…...

《Python 虚拟环境完全指南:如何管理项目依赖,避免版本冲突》

《Python 虚拟环境完全指南:如何管理项目依赖,避免版本冲突》 1. 引言 在 Python 开发中,依赖管理是至关重要的环节。不同项目可能需要不同的库版本,而全局安装库可能导致版本冲突或环境污染。为解决这一问题,Python 提供了虚拟环境(venv、virtualenv),帮助开发者隔离…...

微信小程序带数组参数跳转页面,微信小程序跳转页面带数组参数

在微信小程序中&#xff0c;带数组参数跳转页面需要通过JSON序列化和URL编码处理&#xff0c;以下是具体实现方法 传递数组参数‌&#xff08;发送页面&#xff09; wx.navigateTo({url: /pages/targetPage?arr encodeURIComponent(JSON.stringify(yourArray)) });接收数组参…...

服务器开机自启动服务

前言&#xff1a; 将服务器中脚本开启自启动执行 步骤&#xff1a; 1.创建一个 systemd 服务文件: /etc/systemd/system/ 目录下创建一个新的服务文件。例如&#xff0c;命名为 myapp.service&#xff1a; sudo nano /etc/systemd/system/myapp.service2.编写 [Unit] Descri…...

关于OT IIOT系统远程访问的零信任安全

什么是OT & IIOT&#xff1f;—— 工业领域的“操作基石”与“智能升级” 在工业数字化转型的浪潮中&#xff0c;OT&#xff08;运营技术&#xff09;与IIoT&#xff08;工业物联网&#xff09;是两个核心概念。前者是工业生产的“神经中枢”&#xff0c;后者是驱动智能升…...

【Doris基础】Apache Doris vs 传统数据仓库:架构与性能的全面对比

目录 1 引言 1.1 传统数据仓库的发展 1.2 现代分析型数据库的崛起 2 核心架构对比 2.1 传统数据仓库的架构 2.2 Doris的架构设计 3 关键技术差异 3.1 存储引擎对比 3.2 查询执行对比 3.3 数据摄入方式对比 4 性能与扩展性对比 4.1 性能基准对比 4.2 扩展性对比 5…...

【VScode】python初学者的有力工具

还记得23年11月&#xff0c;我还在欣喜Spyder像Rstudio一样方便。 但苦于打开软件打开太卡、太耗时&#xff08;初始化-再加载一些东西&#xff09;&#xff0c;一度耗费了我学习的热情。 就在24年5月份&#xff0c;别人推荐下发现了一个更加轻量级、方便又快速的ID&#xff0…...

Linux系统中为Qt项目封装一个udp客户端类

Linux系统中为Qt项目封装一个udp客户端类 一、场景 在日常的Qt项目中,我们常用的就是网络通信协议是TCP/UDP, 对于网络协议,Qt都已经封装好了自己的TCP/UDP类,QTcpSocket/QUdpSocket,这些类非常的好用,也非常的易用。 这些类继承自QAbstractSocket,而QAbstractSocket类…...

443端口:HTTPS通信的安全基石

在互联网通信中&#xff0c;端口是数据传输的虚拟通道&#xff0c;每个端口对应特定的服务或协议。其中&#xff0c;443端口 作为 HTTPS协议 的默认端口&#xff0c;在现代网络安全中扮演着至关重要的角色。 一、443端口的核心作用 HTTPS加密通信 443端口是HTTPS&#xff08;…...

宝塔安装WordPress程序

宝塔安装WordPress程序 一、提前准备1&#xff0c;下载WordPress2&#xff0c;在宝塔创建站点 二、部署项目1&#xff0c;上传下载的wordpress压缩包至创建的项目根目录下并解压 三、wordpress安装1&#xff0c;在浏览器打开创建的网站2&#xff0c;开始按照流程安装配置数据库…...

Agent 的7 中设计模式

这里写自定义目录标题 建立有效的Agent什么是Agent&#xff1f;何时&#xff08;以及何时不使用&#xff09;使用代理何时以及如何使用框架构建块、工作流和Agent构建模块&#xff1a;增强型LLM(The augmented LLM)工作流程&#xff1a;提示链接(Prompt chaining)工作流程&…...

OpenGAN:基于开放数据生成的开放集识别

简介 简介&#xff1a;这次学习的OpenGAN主要学习一个思路&#xff0c;跳出传统GAN对于判断真假的识别到判断是已知种类还是未知种类。重点内容不在于代码而是思路&#xff0c;会简要给出一个设计的代码。 论文题目&#xff1a;OpenGAN: Open-Set Recognition via Open Data …...

【node】Express创建服务器

Express是基于Node.js平台&#xff0c;快速、开放、极简的Web开发框架。基于http的express是专门用来创建web服务器的&#xff0c;可以极大的提高开发效率。 Express的创建的服务器 1 web网站服务器 专门对外提供web网页资源的服务器 2 Api接口服务器 专门对外提供Api接口的服…...

使用 OpenCV 实现哈哈镜效果

在计算机视觉和图像处理领域&#xff0c;OpenCV 提供了非常强大的图像几何变换能力&#xff0c;不仅可以用于纠正图像&#xff0c;还能制造各种“有趣”的视觉效果。今天&#xff0c;我们就来实现一个经典的“哈哈镜”效果&#xff0c;让图像像在游乐园里一样被拉伸、压缩、扭曲…...

DeepSeek-R1-0528 模型最新发布:编程推理能力跃升

2025年5月28日&#xff0c;深度求索&#xff08;DeepSeek&#xff09;通过Hugging Face平台悄然发布推理模型DeepSeek-R1-0528 Hugging Face Deepseek-R1-0528模型地址。尽管官方称其为"minor update"&#xff0c;但社区实测显示&#xff0c;该版本在编程能力、复杂推…...

git仓库服务gogs详解

Gogs&#xff08;Go Git Service&#xff09;是一个使用 Go 编写的自助 Git 服务&#xff0c;旨在提供一个轻量级、易部署、高效的 Git 代码托管平台。它类似于 GitHub、GitLab&#xff0c;但更轻量&#xff0c;非常适合私有化部署、小型团队和嵌入式环境。下面是对 Gogs 的详细…...

PaddleNLP 的文本分类项目

以下是一个基于 PaddleNLP 的文本分类项目&#xff0c;按照标准工程结构组织&#xff0c;并包含测试数据集和完整流程。这个示例使用ERNIE模型处理IMDB电影评论情感分析任务。 项目工程结构 ernie_sentiment_analysis/ ├── data/ # 数据集目录 │ ├─…...

git 一台电脑一个git账户,对应多个仓库ssh

生成ssh # 为账户A生成SSH密钥 ssh-keygen -t rsa -b 4096 -C "your_email_for_account_Aexample.com" -f ~/.ssh/id_ed25519 # 为账户B生成SSH密钥 ssh-keygen -t rsa -b 4096 -C "your_email_for_account_Bexample.com" -f ~/.ssh/id_rsa_yswq进入文件…...

node-DeepResearch开源ai程序用于深入调查查询,继续搜索、阅读网页、推理,直到找到答案

​一、软件介绍 文末提供程序和源码下载 node-DeepResearch开源ai程序用于深入调查查询&#xff0c;继续搜索、阅读网页、推理&#xff0c;直到找到答案。 重要提示 与 OpenAI/Gemini/Perfasciity 的“深度研究”不同&#xff0c;我们只专注于通过迭代过程找到正确的答案 。我…...

Asp.Net Core 托管服务

文章目录 前言一、说明二、使用步骤1.创建托管服务方式一&#xff1a;继承 BackgroundService方式二&#xff1a;直接实现 IHostedService 2.注册托管服务3.处理作用域服务4.使用定时器&#xff08;System.Threading.Timer&#xff09;5.结合 Quartz.NET 实现复杂调度 三、. 注…...