[Java惡補day6] 15. 三數之和

給你一個整數數組 nums ,判斷是否存在三元組 [nums[i], nums[j], nums[k]] 滿足 i != j、i != 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
? 10 5 -10^5 ?105 <= nums[i] <= 10 5 10^5 105


知識點:
數組、雙指針、排序、問題轉換為兩數之和


解:
首先,我沒考慮到最暴力的三個嵌套for循環,因為它的復雜度非常大,而本題的核心考點就是雙指針,因此需要考慮如何將問題轉換為求雙指針的問題。
一個很簡單的思路,就是固定其中一個數,去處理另外兩個數,因此,用for循環代表第一個數的遍歷。
因為題目要求結果不能包含重復的三元組,因此:
①將原始數組進行升序排序,再去遍歷,得到的三元組的數字滿足a≤b≤c,這樣就不會出現b,a,c等順序,因此能避免結果出現重復的三元組。
②在每次遍歷中,當前處理的數字,不能和上一次遍歷處理的數字相同,例如:當前第二個元素、上一次遍歷的第二個元素相同,那么這樣就會產生重復。因此,當遇到和上一次遍歷相同的數字,就跳過當前這個數字的遍歷。

基于這個分析,在對pi的for循環遍歷中,定義雙指針pj、pk,分別用于遍歷第二個數、第三個數,并根據#兩數之和這道題的思路,兩個指針從兩端開始向中間遍歷,只要左指針指向的數字<右指針指向的數字,就繼續循環。
對于每次得到的第二個數、第三個數,我們計算三數之和sum,并有以下三種情況:
①若和為0,滿足條件,就構造List,存到結果列表中。然后要更新雙指針。但首先,需要判斷指針遍歷的元素是否與上一次遍歷的元素相同,若相同,則讓指針向右/左移動一格。接下來,再去同時更新雙指針(這里需要同時更新雙指針,是因為:小的那個數變大,為了保持和不變,大的那個數要同時變小)。
②若和<0,表示我們要獲得更大的一個數,由于第三個數代表的是三元組中最大的數,因此我們讓代表第二個數的左指針右移一格。
③若和>0,表示我們要獲得更小的一個數,由于第二個數代表的是三元組中最小的數(此時我們固定了第一個數,因此可以這么描述),因此我們讓代表第三個數的右指針左移一格。

時間復雜度: O ( n 2 ) O(n^2) O(n2)
空間復雜度: O ( n ) O(n) O(n),由于對原始數組進行了排序,因此可視為使用一個額外的數組存儲了nums的副本并進行排序 【該分析源自力扣官解】

class Solution {public List<List<Integer>> threeSum(int[] nums) {//目標:數組的三個不同數字和為0//定義最終結果的數據結構List<List<Integer>> res = new ArrayList<>();//數組長度int n = nums.length;//原數組進行排序,實現最終結果的去重Arrays.sort(nums);//遍歷所有元素for (int pi = 0; pi < n - 2; pi++) {//當前遍歷的第一個元素需要不等于前一個元素,以降低時間復雜度if (pi > 0 && nums[pi] == nums[pi - 1]) {continue;}//問題轉化為:固定第一個數的情況下,對另外兩個數進行常規雙指針操作//定義雙指針int pj = pi + 1;int pk = n - 1;//只要左指針<右指針,就繼續循環while (pj < pk) {//計算三數之和int sum = nums[pi] + nums[pj] + nums[pk];if (sum == 0) {//滿足要求,加入resList<Integer> triplets = new ArrayList<>();triplets.addAll(Arrays.asList(nums[pi], nums[pj], nums[pk]));//一次性添加三個元素res.add(triplets);//跳過重復元素while (pj < pk && nums[pj] == nums[pj + 1])pj++;while (pj < pk && nums[pk] == nums[pk - 1])pk--;//更新雙指針(小的那個數變大,為了保持和不變,大的那個數要同時變小)pj++;pk--;} else if (sum < 0) {//和小于0,尋找比第二小的數稍微大一點的數pj++;} else {//和大于0,尋找比第一大的數稍微小一點的數pk--;}}}return res;}
}

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

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

相關文章

《黃帝內經》數學建模與形式化表征方式的重構

黃帝內經的數學概括&#xff1a;《黃帝內經》數學建模與形式化表征方式的重構 摘要&#xff1a;《黃帝內經》通過現代數學理論如動力系統、代數拓撲和隨機過程&#xff0c;被重構為一個形式化的人體健康模型。該模型包括陰陽動力學的微分幾何、五行代數的李群結構、經絡拓撲與同…

理論篇五:如何優化Webpack的打包速度

優化 Webpack 打包速度是提升前端開發效率的關鍵。以下是 10 種核心優化策略,涵蓋開發和生產環境,附帶具體配置和實測效果對比: 一、縮小文件搜索范圍 1. 指定解析路徑(Resolve) resolve: {extensions: [.js, .jsx],

[Windows] 游戲常用運行庫- Game Runtime Libraries Package(6.2.25.0409)

游戲常用運行庫 合集 整合了許多游戲會用到的運行庫&#xff0c;支持 Windows XP – Windows 11 系統&#xff0c;并且支持自動檢測系統勾選推薦的運行庫&#xff0c;方便快捷。 本版特點&#xff1a; By&#xff1a;mefcl 整合常見最新游戲所需運行庫 根據系統自動勾選推薦…

JDK8中的 Stream流式編程用法優化(工具類在文章最后)

Java從JDK8起提供了Stream流這個功能&#xff0c;于是項目里出現了大量基于Stream流的寫法。隨著項目的進行&#xff0c;慢慢的代碼中鋪天蓋地的都是下面的寫法&#xff1a; List<User> userList null;if (condition) {userList new ArrayList<>();userList.add(…

uni-app學習筆記十二-vue3中組件傳值(對象傳值)

一.單對象傳值 父組件定義對象的值 <template><view><UserInfo :obj"userinfo"></UserInfo></view> </template><script setup>import {ref} from "vue"const userinfo ref({name:"蛛兒",avatar:&…

UV-python環境管理工具 入門教程

在學習使用 MCP 的時候接觸到了 UV 這個環境管理工具&#xff0c;經過對比&#xff0c;發現它在諸多方面比 venv、conda 等工具更為出色&#xff0c;因此整理了這份簡單的入門學習筆記&#xff0c;希望能幫助大家快速上手。 介紹 UV 是一款集 Python 版本管理、虛擬環境創建與…

【漫話機器學習系列】277.梯度裁剪(Gradient Clipping)

【深度學習】什么是梯度裁剪&#xff08;Gradient Clipping&#xff09;&#xff1f;一張圖徹底搞懂&#xff01; 在訓練深度神經網絡&#xff0c;尤其是 RNN、LSTM、Transformer 這類深層結構時&#xff0c;你是否遇到過以下情況&#xff1a; 模型 loss 突然變成 NaN&#xf…

零基礎弄懂 ngx_http_slice_module分片緩存加速

一、為什么需要 Slice&#xff1f; 在 NGINX 反向代理或 CDN 場景中&#xff0c;大文件&#xff08;視頻、軟件包、鏡像等&#xff09;常因單體體積過大而令緩存命中率低、回源代價高。 ngx_http_slice_module 通過把一次完整響應拆分成 固定大小的字節塊&#xff08;Slice&am…

機器人強化學習入門學習筆記(三)

強化學習&#xff08;Reinforcement Learning, RL&#xff09;與監督學習不同——你不需要預先準備訓練數據集&#xff0c;而是要設計環境、獎勵函數&#xff0c;讓智能體通過交互不斷探索和學習。 &#x1f3af; 一、強化學習和訓練數據的關系 強化學習不依賴固定的數據集。它…

【python實戰】二手房房價數據分析與預測

個人主頁&#xff1a;大數據蟒行探索者 目錄 一、數據分析目標與任務 1.1背景介紹 1.2課程設計目標與任務 1.3研究方法與技術路線 二、數據預處理 2.1數據說明 2.2數據清洗 2.3數據處理 三、數據探索分析 四、數據分析模型 五、方案評估 摘要&#xff1a;隨著社會經…

Kotlin IR編譯器插件開發指南

在 Kotlin 中開發基于 IR&#xff08;Intermediate Representation&#xff09;的編譯器插件&#xff0c;可以深度定制語言功能或實現高級代碼轉換。以下是分步驟指南&#xff1a; 一、IR 編譯器插件基礎 IR 是什么&#xff1f; Kotlin 編譯器將源碼轉換為 IR 中間表示&#xf…

如何用 python 代碼復現 MATLAB simulink 的 PID

MATLAB在 Simulink 里做以下設置MATLAB 腳本調用示例 python 實現離散 PID 實現&#xff08;并行形式&#xff09; Simulink 中兩種 PID 結構&#xff08;并聯形式, I-形式&#xff09;下連續/離散時域里積分增益 I 的表示并聯&#xff08;Parallel&#xff09; vs 理想&#x…

黑馬點評--基于Redis實現共享session登錄

集群的session共享問題分析 session共享問題&#xff1a;多臺Tomcat無法共享session存儲空間&#xff0c;當請求切換到不同Tomcat服務時&#xff0c;原來存儲在一臺Tomcat服務中的數據&#xff0c;在其他Tomcat中是看不到的&#xff0c;這就導致了導致數據丟失的問題。 雖然系…

SkyWalking啟動失敗:OpenSearch分片數量達到上限的完美解決方案

?? 問題現象 SkyWalking OAP服務啟動時報錯: org.apache.skywalking.oap.server.library.module.ModuleStartException: java.lang.RuntimeException: {"error":{"root_cause":[{"type":"validation_exception", "reason&q…

向量數據庫選型實戰指南:Milvus架構深度解析與技術對比

導讀&#xff1a;隨著大語言模型和AI應用的快速普及&#xff0c;傳統數據庫在處理高維向量數據時面臨的性能瓶頸日益凸顯。當文檔經過嵌入模型處理生成768到1536維的向量后&#xff0c;傳統B-Tree索引的檢索效率會出現顯著下降&#xff0c;而現代應用對毫秒級響應的嚴苛要求使得…

MySQL#秘籍#一條SQL語句執行時間以及資源分析

背景 一條 SQL 語句的執行完&#xff0c;每個模塊耗時&#xff0c;不同資源(CPU/IO/IPC/SWAP)消耗情況我該如何知道呢&#xff1f;別慌俺有 - MySQL profiling 1. SQL語句執行前 - 開啟profiling -- profiling (0-關閉 1-開啟) -- 或者&#xff1a;show variables like prof…

【數據結構】實現方式、應用場景與優缺點的系統總結

以下是編程中常見的數據結構及其實現方式、應用場景與優缺點的系統總結&#xff1a; 一、線性數據結構 1. 數組 (Array) 定義&#xff1a;連續內存空間存儲相同類型元素。實現方式&#xff1a;int[] arr new int[10]; // Javaarr [0] * 10 # Python操作&#xff1a; 訪問&…

PyTorch中cdist和sum函數使用示例詳解

以下是PyTorch中cdist與sum函數的聯合使用詳解: 1. cdist函數解析 功能:計算兩個張量間的成對距離矩陣 輸入格式: X1:形狀為(B, P, M)的張量X2:形狀為(B, R, M)的張量p:距離類型(默認2表示歐式距離)輸出:形狀為(B, P, R)的距離矩陣,其中元素 d i j d_{ij} dij?表示…

Ansible配置文件常用選項詳解

Ansible 的配置文件采用 INI 格式&#xff0c;分為多個模塊&#xff0c;每個模塊包含特定功能的配置參數。 以下是ansible.cfg配置文件中對各部分的詳細解析&#xff1a; [defaults]&#xff08;全局默認配置&#xff09; inventory 指定主機清單文件路徑&#xff0c;默認值為 …

了解FTP搜索引擎

根據資料&#xff0c; FTP搜索引擎是專門搜集匿名FTP服務器提供的目錄列表&#xff0c;并向用戶提供文件信息的網站&#xff1b; FTP搜索引擎專門針對FTP服務器上的文件進行搜索&#xff1b; 就是它的搜索結果是一些FTP資源&#xff1b; 知名的FTP搜索引擎如下&#xff0c; …