LeetCode Hot 100:15. 三數之和

題目

給你一個整數數組?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 。

解析

為方便雙指針以及跳過相同元素,先把 nums 排序。

枚舉 nums[i],問題變成 nums[j]+nums[k]=?nums[i]。

題目要求答案中不能有重復的三元組。如何避免重復?

在外層循環中,如果發現 nums[i]=nums[i?1],那么 nums[i] 與后面兩個數組成的和為 0 的三元組,nums[i?1] 也能組成一模一樣的三元組,這就重復了,所以遇到 nums[i]=nums[i?1] 的情況,直接 continue。

在內層循環中,當三數之和等于 0 時,為避免把相同的三元組計入答案,跳過后續相同的 nums[j] 和 nums[k](也可以只跳過相同的 nums[j])。

優化
優化一:如果 nums[i] 與后面最小的兩個數相加 nums[i]+nums[i+1]+nums[i+2]>0,那么后面不可能存在三數之和等于 0,break 外層循環。

優化二:如果 nums[i] 與后面最大的兩個數相加 nums[i]+nums[n?2]+nums[n?1]<0,那么內層循環不可能存在三數之和等于 0,但繼續枚舉,nums[i] 可以變大,所以后面還有機會找到三數之和等于 0,continue 外層循環。

------------------------------------------------

作者:靈茶山艾府
鏈接:https://leetcode.cn/problems/3sum/
來源:力扣(LeetCode)

答案

/*** @param {number[]} nums* @return {number[][]}*/
var threeSum = function(nums) {nums.sort((a,b) => a-b);    //排序const ans = [];const len = nums.length;for(let k=0; k<len-2; k++) {//和前一個數相同,那么后面能組成0的兩個數的答案相同,跳過該數if(k>0 && nums[k] === nums[k-1]) continue;//和后面兩個最小的數之和都大于0,不可能找到等于0的兩個數,跳出for循環if(nums[k] + nums[k+1] + nums[k+2] > 0) break;//和最后兩個最大的數之和都小于0,內層循環固定位的數太小,回到外層循環找更大的數if(nums[k] + nums[len-2] + nums[len-1] < 0) continue;let i = k+1, j=len-1;while(i < j) {const s = nums[k] + nums[i] + nums[j];if(s < 0) {    //換更大的加數i++;} else if(s > 0) {    //換更小的加數j--;} else {ans.push([ nums[k], nums[i], nums[j]]);    //等于0,加入答案for(i++; i<j && nums[i] === nums[i-1]; i++);    //跳過重復的數for(j--; j>i && nums[j] === nums[j+1]; j--);    //跳過重復的數}}}return ans;
};

復雜度分析

時間復雜度:O(n^2),其中 n 為 nums 的長度。排序 O(nlogn)。外層循環枚舉第一個數,做法是 O(n) 雙指針。所以總的時間復雜度為 O(n^2?)。
空間復雜度:O(1)。返回值不計入。忽略排序的棧開銷。

------------------------------------------------

作者:靈茶山艾府
鏈接:https://leetcode.cn/problems/3sum/
來源:力扣(LeetCode)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/93925.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93925.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93925.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

銀行回單識別應用場景剖析

銀行回單OCR識別技術通過自動化處理紙質或電子回單中的關鍵信息&#xff0c;顯著提升了金融、企業及個人場景下的數據管理效率。以下是其核心應用場景及價值的詳細剖析&#xff1a;一、企業財務場景自動化賬務處理對賬與記賬&#xff1a;OCR自動提取交易日期、金額、賬號等信息…

React的介紹和特點

1. React是什么&#xff1f; 1.1. React&#xff1a; 用于構建用戶界面的JavaScript庫1.2. React的官網文檔&#xff1a;https://zh-hans.reactjs.org/ 2. React的特點2.1. 聲明式編程&#xff1a; 目前整個大前端開發的模式&#xff1a;Vue、React、Flutter、SwiftUI只需要維護…

內核smmu學習

思考 smmu對外提供功能&#xff0c;設備驅動調用smmu 提供的api來配置頁表&#xff0c;那其他設備是如何和smmu交互的&#xff1f;iommu 作為將不同smmu硬件的一個抽象封裝&#xff0c;其它設備應該只能看到iommu這個封裝層&#xff0c;那么iommu這個子系統是如何進行抽象的&a…

Android Slices:讓應用功能在系統級交互中觸手可及

引言 在當今移動應用生態中&#xff0c;用戶每天要面對數十個甚至上百個應用的選擇&#xff0c;如何讓自己的應用在關鍵時刻觸達用戶&#xff0c;成為開發者面臨的重要挑戰。Google在Android 9 Pie中引入的Slices技術&#xff0c;正是為了解決這一痛點而生。本文將全面介紹And…

python學智能算法(三十))|SVM-KKT條件的數學理解

【1】引言 前序學習進程中&#xff0c;通過類比力的平衡對KKT條件進行了初步的理解。 今天我們更進一步&#xff0c;常使用數學語言進一步解釋KKT條件。 【2】帶約束的最小優化問題 首先定義一個即將求解的優化問題&#xff1a; 目標函數&#xff1a;最小化f(x)(x∈Rn)f(x)(…

華為云Flexus+DeepSeek征文|Linux命令實現兩種部署的性能捕獲+(硅基+Maas)模型添加教學

前引&#xff1a;“在數字化浪潮洶涌澎湃的今天&#xff0c;企業對云計算服務的需求已從基礎架構支撐&#xff0c;逐步轉向更深層次的AI賦能與業務創新驅動。面對復雜多變的市場環境&#xff0c;選擇一個強大、可靠且具備前瞻性的云服務伙伴&#xff0c;無疑是企業實現高速增長…

langchain--1--prompt、output格式、LCEL示例

環境&#xff1a;本地使用ollama部署的deepseek-r1:1.5b模型 本文示例包含: [1] 非LCEL的調用方法[2] LCEL的調用方法[3] prompt template的簡單使用&#xff0c;除了PromptTemplate模板&#xff0c;還有一些其它模板&#xff0c;可去查看官網[4] 輸出&#xff1a;json格式、py…

【算法】指數滑動濾波器

指數滑動濾波器作用原理特點公式代碼優化升級作用 首先這個濾波器能夠將一些突變的信號對系統的影響降低&#xff0c;能夠平滑輸入信號&#xff0c;濾除噪聲&#xff0c;減少測量數據的瞬間波動和干擾&#xff0c;就是實現輸入信號不能不變&#xff0c;數值不會突然變大&#…

STM32F4—電源管理器

Power supply schemesPower supply supervisorInternal reset ON有PDR_ON pin的MCU&#xff0c;PDR_ON pin被拉高的時候電源監視器被使能。沒有PDR_ON pin的MCU默認一直使能。內部集成了power-on reset (POR) / power-down reset (PDR)POR&#xff08;上電復位&#xff09;&…

MySQL鎖的分類 MVCC和S/X鎖的互補關系

各位看官&#xff0c;大家早安午安晚安呀~~~如果您覺得這篇文章對您有幫助的話歡迎您一鍵三連&#xff0c;小編盡全力做到更好 歡迎您分享給更多人哦今天我們來學習&#xff1a;MySQL鎖的分類 && MVCC和S/X鎖的互補關系1.鎖分類1.按鎖粒度分類&#xff1a;全局鎖&#…

第五屆智能通信與計算國際學術會議(ICICC 2025)

重要信息 官網&#xff1a;www.ic-icc.org 時間&#xff1a;2025年8月15-16日 地點&#xff1a;中國 南京 第五屆智能通信與計算國際學術會議(ICICC 2025&#xff09;定于2025年8月15-16日在中國 南京舉行。隨著信息技術的飛速發展&#xff0c;智能通信與計算領域的研究與…

基于C#和NModbus4庫實現的Modbus RTU串口通信

基于C#和NModbus4庫實現的Modbus RTU串口通信&#xff0c;包含完整的界面設計和功能實現&#xff1a;一、項目依賴配置NuGet包安裝&#xff1a; Install-Package NModbus4 Install-Package System.IO.Ports窗體控件布局&#xff1a; <!-- 基礎控件配置 --> <ComboBox …

想要批量提取視頻背景音樂?FFmpeg 和轉換器都安排上

你是否遇到過這樣的情況&#xff1f;看到一個超贊的短視頻&#xff0c;里面的背景音樂特別好聽&#xff0c;想單獨保存下來當手機鈴聲或收藏&#xff0c;卻不知道怎么把音樂從視頻里“摳”出來&#xff1f;別擔心&#xff01;今天就為大家分享兩種簡單易行的方法&#xff0c;無…

為什么MCP協議是AI集成的未來API

一、企業AI應用的核心挑戰與架構演進 當前企業AI落地面臨三大核心痛點&#xff1a; ??系統集成困境??&#xff1a;需對接企業內部業務系統&#xff08;CRM/ERP等&#xff09;??異構環境兼容??&#xff1a;需整合第三方AI服務與傳統API??數據孤島突破??&#xff1…

Apache Tomcat樣例目錄session操縱漏洞解讀

【漏洞名稱】&#xff1a;Apache Tomcat樣例目錄session操縱漏洞 &#xff08;Apache Tomcat示例目錄漏洞&#xff09;【漏洞等級】&#xff1a;中危&#xff0c;5.9分。【漏洞描述】Apache Tomcat默認安裝頁面中存在examples樣例目錄&#xff0c;里面存放著Servlets、JSP、Web…

Go語言實戰案例:實現HTTP客戶端請求并解析響應

本文是 Go 網絡與并發實戰系列的第2篇&#xff0c;聚焦于如何使用 Go 實現一個 HTTP 客戶端&#xff0c;完成請求發送、響應解析、錯誤處理、Header與Body提取等完整流程。一、前言&#xff1a;為什么學習HTTP客戶端&#xff1f;在日常開發中&#xff0c;無論是調用 RESTful AP…

java的冒泡排序算法

冒泡排序是一種簡單的排序算法&#xff0c;通過重復遍歷待排序序列&#xff0c;比較相鄰元素并在必要時交換位置&#xff0c;最終實現排序。以下是Java實現的詳細說明&#xff1a;核心原理?比較相鄰元素?&#xff1a;從序列第一個元素開始&#xff0c;逐對比較相鄰元素的大小…

玻爾茲曼分布與玻爾茲曼探索

目錄 玻爾茲曼分布定義 玻爾茲曼探索&#xff1a; 1. 玻爾茲曼分布公式 2. 溫度 T 如何影響采樣結果&#xff1f; (1) 高溫 (T→∞)&#xff1a; (2) 低溫 (T→0)&#xff1a; (3) 中等溫度 (T∈(0,∞))&#xff1a; 3. 直觀示例 4. 實際應用中的意義 5.核心誤區澄清…

【工具】jsDelivr CDN完全指南:免費高速的開源項目CDN服務

前言 在現代Web開發中&#xff0c;內容分發網絡&#xff08;CDN&#xff09;已經成為提升網站性能的重要工具。jsDelivr作為一個免費、快速、可靠的開源CDN服務&#xff0c;為全球開發者提供了優質的靜態資源分發服務。無論是加速GitHub倉庫訪問、分發npm包&#xff0c;還是為…

OSPF筆記整理

一、OSPF 基礎特性1. 技術背景&#xff08;對比 RIP&#xff09;RIP 的缺陷&#xff1a;最大跳數 15 限制、周期性發送全路由表&#xff08;占用帶寬&#xff09;、收斂慢、以跳數為度量值、易產生環路、30 秒更新間隔。OSPF 的改進&#xff1a;無跳數限制&#xff08;支持大規…