雙指針(2)—三數之和

文章目錄

  • 題目解析
    • 解法(排序+雙指針):
    • 哈希解法
    • 附加Java代碼:

力扣題目:三數之和

題目解析

在這里插入圖片描述

解法(排序+雙指針):

**算法思路:**
本題與兩數之和類似,是?常經典的?試題。
與兩數之和稍微不同的是,題?中要求找到所有「不重復」的三元組。那我們可以利?在兩數之和
那??的雙指針思想,來對我們的暴?枚舉做優化:
i. 先排序;
ii. 然后固定?個數 a :
iii. 在這個數后?的區間內,使?「雙指針算法」快速找到兩個數之和等于 -a 即可。
但是要注意的是,這道題??需要有「去重」操作~
i. 找到?個結果之后, left 和 right 指針要「跳過重復」的元素;
ii. 當使?完?次雙指針算法之后,固定的 a 也要「跳過重復」的元素。
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {ranges::sort(nums);vector<vector<int>> ans;int n = nums.size();for (int i = 0; i < n - 2; i++) {int x = nums[i];if (i && x == nums[i - 1]) continue; // 跳過重復數字if (x + nums[i + 1] + nums[i + 2] > 0) break; // 優化一if (x + nums[n - 2] + nums[n - 1] < 0) continue; // 優化二int j = i + 1, k = n - 1;while (j < k) {int s = x + nums[j] + nums[k];if (s > 0) {k--;} else if (s < 0) {j++;} else { // 三數之和為 0ans.push_back({x, nums[j], nums[k]});for (j++; j < k && nums[j] == nums[j - 1]; j++); // 跳過重復數字for (k--; k > j && nums[k] == nums[k + 1]; k--); // 跳過重復數字}}}return ans;}
};

哈希解法

兩層for循環就可以確定 a 和b 的數值了,可以使用哈希法來確定 0-(a+b) 是否在 數組里出現過,其實這個思路是正確的,但是我們有一個非常棘手的問題,就是題目中說的不可以包含重復的三元組。

把符合條件的三元組放進vector中,然后再去重,這樣是非常費時的,很容易超時,也是這道題目通過率如此之低的根源所在。

去重的過程不好處理,有很多小細節,如果在面試中很難想到位。

時間復雜度可以做到O(n^2),但還是比較費時的,因為不好做剪枝操作。

大家可以嘗試使用哈希法寫一寫,就知道其困難的程度了。

哈希法C++代碼:

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> result;sort(nums.begin(), nums.end());// 找出a + b + c = 0// a = nums[i], b = nums[j], c = -(a + b)for (int i = 0; i < nums.size(); i++) {// 排序之后如果第一個元素已經大于零,那么不可能湊成三元組if (nums[i] > 0) {break;}if (i > 0 && nums[i] == nums[i - 1]) { //三元組元素a去重continue;}unordered_set<int> set;for (int j = i + 1; j < nums.size(); j++) {if (j > i + 2&& nums[j] == nums[j-1]&& nums[j-1] == nums[j-2]) { // 三元組元素b去重continue;}int c = 0 - (nums[i] + nums[j]);if (set.find(c) != set.end()) {result.push_back({nums[i], nums[j], c});set.erase(c);// 三元組元素c去重} else {set.insert(nums[j]);}}}return result;}
};

附加Java代碼:

class Solution {public List<List<Integer>> threeSum(int[] nums) {int n = nums.length;Arrays.sort(nums);List<List<Integer>> ans = new ArrayList<List<Integer>>();// 枚舉 afor (int first = 0; first < n; ++first) {// 需要和上一次枚舉的數不相同if (first > 0 && nums[first] == nums[first - 1]) {continue;}// c 對應的指針初始指向數組的最右端int third = n - 1;int target = -nums[first];// 枚舉 bfor (int second = first + 1; second < n; ++second) {// 需要和上一次枚舉的數不相同if (second > first + 1 && nums[second] == nums[second - 1]) {continue;}// 需要保證 b 的指針在 c 的指針的左側while (second < third && nums[second] + nums[third] > target) {--third;}// 如果指針重合,隨著 b 后續的增加// 就不會有滿足 a+b+c=0 并且 b<c 的 c 了,可以退出循環if (second == third) {break;}if (nums[second] + nums[third] == target) {List<Integer> list = new ArrayList<Integer>();list.add(nums[first]);list.add(nums[second]);list.add(nums[third]);ans.add(list);}}}return ans;}
}

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

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

相關文章

設計一套水產養殖系統

設計一套水產養殖系統 引言 水產養殖在全球糧食安全和經濟發展中日益重要。它不僅為不斷增長的人口提供了重要的蛋白質來源&#xff0c;還在許多地區創造了就業機會并促進了經濟增長 。全球超過一半的人類消費的海產品來自水產養殖&#xff0c;并且這一比例預計將繼續上升 。…

統計可重復列表中的TOP N

文章目錄 方案1&#xff1a;HashMap統計 全排序實現步驟&#xff1a;代碼實現&#xff1a;優缺點&#xff1a; 方案2&#xff1a;HashMap統計 最小堆&#xff08;優先隊列&#xff09;實現步驟&#xff1a;代碼實現&#xff1a;優缺點&#xff1a; 方案3&#xff1a;Java Str…

JVM 知識點梳理

JDK 、JRE、JVM JDK&#xff08; Java Development Kit &#xff09; Java開發工具包 JRE 開發命令工具&#xff08;運行java.exe、編譯javac.exe、javaw.exe&#xff09; JRE&#xff08; Java Runtime Environment &#xff09;Java運行環境 JVM Java核心類庫&#xff08;l…

淘寶歷史價格數據獲取指南:API 與爬蟲方案的合法性與效率對比

引言 在淘寶平臺的購物生態中&#xff0c;消費者希望通過了解商品歷史價格來判斷當前價格是否實惠&#xff0c;商家也需要借助歷史價格數據制定合理的營銷策略、分析市場趨勢。獲取淘寶商品歷史價格數據主要有 API 和爬蟲兩種方案&#xff0c;它們在合法性與效率上存在顯著差異…

DeepSeek-R1論文深度解析:純強化學習如何引爆LLM推理革命?

技術突破&#xff1a;從“無監督”到“自主進化”的跨越 paper &#xff1a;https://arxiv.org/pdf/2501.12948目錄 技術突破&#xff1a;從“無監督”到“自主進化”的跨越1 DeepSeek-R1-Zero&#xff1a; RLnoSFT1.1 R1-Zero&#xff1a; GRPO&#xff08;Group Relative Po…

表格標題豎直

使用文本方式使表格怎么豎列 思路&#xff1a;表格豎直書寫&#xff0c;里面的內容水平書寫 使用到的是css中的文本效果&#xff1a; writing-mode&#xff1a;書寫方式horizontal-tb&#xff1a;水平vertical-rl&#xff1a;豎直<style>table {writing-mode: vertical…

AI+視頻賦能智慧農業:EasyCVR打造全域可視化農場監管平臺

隨著科技的飛速發展&#xff0c;傳統農業正加速向智慧農業轉型&#xff0c;農場管理也迎來了前所未有的變革機遇。在這一進程中&#xff0c;如何有效整合先進的信息技術&#xff0c;實現農場的精準化、智能化管理&#xff0c;成為了擺在農場主和農業管理者面前的關鍵課題。 基于…

HarmonyOS鴻蒙開發 BuilderParam在父組件的Builder的點擊事件報錯:Error message:is not callable

HarmonyOS鴻蒙開發 BuilderParam在父組件的Builder的點擊事件報錯&#xff1a;Error message:is not callable 最近在鴻蒙開發過程中&#xff0c;UI做好了&#xff0c;根據列表item進行點擊跳轉&#xff0c;報錯了 報錯信息如下 Error message:is not callable Stacktrace:at…

簡化神經元模型6 -- Hindmarsh-Rose Model

Hindmarsh-Rose 模型 目錄 0. 寫在前面 1. Hindmarsh-Rose 模型的定義 2. Hindmarsh-Rose 模型簇發放的動力學機制 3. Hindmarsh-Rose 模型的其他發放模式 4. 分析過程所用到的一系列 BrainPy 代碼 0. 寫在前面 前面介紹了: Hodgkin-Huxley Model 簡化神經元模型1 – LIF M…

第六屆電氣、電子信息與通信工程國際學術會議 (EEICE 2025)

重要信息 官網&#xff1a;www.eeice.net&#xff08;點擊了解參會投稿等&#xff09; 時間&#xff1a;2025年4月18-20日 地點&#xff1a;中國-深圳技術大學 簡介 第六屆電氣、電子信息與通信工程 (EEICE 2025&#xff09;將于2025年4月18-20日在中國深圳召開。 EEICE 20…

計算機操作系統(三) 操作系統的特性、運行環境與核心功能(附帶圖譜更好對比理解))

計算機操作系統&#xff08;三&#xff09; 操作系統的特性、運行環境與核心功能 前言一、操作系統的基本特性1.1 并發1.2 共享1.3 虛擬1.4 異步 二、操作系統的運行環境2.1 硬件支持2.2 操作系統內核2.3 處理機的雙重工作模式2.4 中斷與異常 三、操作系統的主要功能3.1 處理機…

Linux(Ubuntu)系統安裝Docker與Docker Compose完整指南

本文是為需要在Ubuntu系統部署容器服務的開發者準備的詳細教程。我們將分兩個主要部分講解&#xff1a;Docker引擎的標準安裝流程和Docker Compose的配置方法。所有操作均在終端執行&#xff0c;建議使用Ubuntu 18.04及以上版本。 一、Docker引擎安裝全流程 &#xff08;總耗時…

批量將 PPT 轉換為PDF/XPS/JPG圖片等其它格式

PPT 文檔經常有轉換為其它格式的需求&#xff0c;比如將 PPT 轉換為 PDF、將 PPT 轉換為圖片、生成 PPT 預覽圖等&#xff0c;這在某些場景下非常的有用&#xff0c;今天給大家介紹的就是如何批量將 PDF 轉換為 PDF、JPG、Tiff 等多種格式的操作。 在工作中我們經常需要接觸 PP…

c庫、POSIX庫、C++庫、boost庫之間的區別和聯系

文章目錄 一、區別1. 定義和來源2. 功能范圍3. 可移植性4. 語言支持5. 維護和更新 二、聯系1. 相互補充2. 部分功能重疊3. 共同促進編程發展4. 代碼兼容性 三、總結 一、區別 1. 定義和來源 C 庫函數&#xff1a;由 ANSI C 和 ISO C 標準定義&#xff0c;是 C 語言編程的基礎…

響應壓縮導致的接口請求response沒有響應體問題排查

目錄 一、背景二、排查過程三、解決方法四、學習與思考-響應壓縮&#xff08;一&#xff09;可能原因&#xff08;二&#xff09;深入排查&#xff08;三&#xff09;注意 一、背景 接口發布到測試環境&#xff0c;測試同學說沒有數據 二、排查過程 1、本地用相同的參數、相…

JVM中的運行時常量池詳解

運行時常量池&#xff08;Runtime Constant Pool&#xff09;是每一個類或接口的常量池&#xff08;Constant_Pool&#xff09;的運行時表示形式&#xff0c;它包括了若干種不同的常量&#xff1a;從編譯期可知的數值字面量到必須運行期解析后才能獲得的方法或字段引用。運行時…

C# MethodBase 類使用詳解

總目錄 前言 在C#編程中&#xff0c;反射&#xff08;Reflection&#xff09;是一種強大的機制&#xff0c;允許我們在運行時檢查和操作類型的成員。MethodBase 類是.NET框架中 System.Reflection 命名空間下的一個抽象類&#xff0c;它是所有方法( MethodInfo 和 Constructor…

【css酷炫效果】純CSS實現3D翻轉卡片動畫

【css酷炫效果】純CSS實現3D翻轉卡片動畫 緣創作背景html結構css樣式完整代碼效果圖 想直接拿走的老板&#xff0c;鏈接放在這里&#xff1a;https://download.csdn.net/download/u011561335/90490472 緣 創作隨緣&#xff0c;不定時更新。 創作背景 剛看到csdn出活動了&am…

Flask多參數模版使用

需要建立目錄templates&#xff1b; 把建好的html文件放到templates目錄里面&#xff1b; 約定好參數名字&#xff0c;單個名字可以直接使用&#xff1b;多參數使用字典傳遞&#xff1b; 樣例&#xff1a; from flask import render_template # 模板 (Templates) #Flask 使用…

SVN簡明教程——下載安裝使用

SVN教程目錄 一、開發中的實際問題二、簡介2.1 版本控制2.2 Subversion2.3 Subversion的優良特性2.4 工作原理2.5 SVN基本操作 三、Subversion的安裝與配置1. 服務器端程序版本2. 下載源碼包3. 下載二進制安裝包4. 安裝5. 配置版本庫① 為什么要配置版本庫&#xff1f;② 創建目…