leecode-15 三數之和

在這里插入圖片描述

我的解法(不是完全解309/314)

  • 我的思路是定義一個left和一個right,然后在向集合里去查詢,看看有沒有除了nums[left],和nums[right]的第三個元素,把這個問題轉換為一個遍歷查找問題

    • 利用List.contains()方法來查找剩余元素
    • 利用List.remove和List.add(),來模擬派出了nums[left]和nums[right]的集合
  • 但是這種思路有個問題,就是時間復雜度太高了,我只通過了309/314的示例。

    • 其中這個ArrayList.contains 是 O(n),ArrayList.remove(Integer) 也是 O(n),然后外層有一個從left-length,有一個從length-left,循環接近O(n3),時間復雜度太高了
    • int left = 0,right =0;
      ArrayList<Integer> list = new ArrayList<>();
      for(int num:nums){list.add(num);
      }
      List<List<Integer>> result = new ArrayList<>();
      for(;left<nums.length-2;left++){list.remove(Integer.valueOf(nums[left]));List<Integer> temp = new ArrayList<>();int a =0;for(right=nums.length-1;right>left;right--){list.remove(Integer.valueOf(nums[right]));a = 0-nums[left]-nums[right];if(list.contains(a)){Collections.addAll(temp,nums[left],nums[right],a);List<Integer> temp2 = new ArrayList<>(temp);Collections.sort(temp2);if(!result.contains(temp2)){result.add(temp2);}temp.clear();}list.add(nums[right]);}
      }
      return result;
      
  • 改進1:對于這個代碼我們需要想辦法減少它的時間復雜度,為了遍歷出所有情況,內外兩層循環遍歷是不能夠改變的。所以我們可以想辦法去減少這個查找的時間復雜度,將這個集合轉換為哈希集合,這樣查詢的時間復雜度就變成了O(1)了

    • 但是很遺憾,這個時間復雜度還是高了,還需要繼續降時間復雜度
    • List<List<Integer>> result = new ArrayList<>();
      // 用 HashMap 統計每個數字的出現次數(替代 ArrayList)
      Map<Integer, Integer> count = new HashMap<>();
      for (int num : nums) {count.put(num, count.getOrDefault(num, 0) + 1);
      }
      // 為了去重,排序后按順序枚舉
      int n = nums.length;
      for (int i = 0; i < n - 2; i++) {int left = nums[i];count.put(left, count.get(left) - 1); // 用掉一個 leftfor (int j = n-1; j >i; j--) {int right = nums[j];count.put(right, count.get(right) - 1); // 用掉一個 rightint target = 0 - left - right;// 檢查剩余集合中是否有 targetif (count.getOrDefault(target, 0) > 0) {List<Integer> list = Arrays.asList(left, right, target);Collections.sort(list); // 排序以確保結果的唯一性if (!result.contains(list)) {result.add(list);}}// 把 right 加回來,供下一輪使用count.put(right, count.get(right) + 1);}
      }
      return result;
      

靈神的思路

  • 靈神在講這個題的時候先參考了這個 📄((20250730131645-jdjxatg ‘0167 兩數之和II-輸入有序數組’)) 這個題
    如果是兩個數的話,我們就可以使用兩個指針進行快速的尋找
    所以我們想想辦法,看怎么使這個三個數的和變成兩個數

  • 我們可以通過先對這個數組進行排序,這樣就和0167題具有了相同的初始條件,即數組有序
    之后我們對這個數組進行遍歷,先確定一個數,之后再剩余的數組中,找到兩個數的和為0-這個數,此時就和0167題相似了。

  • 有一個點,不太容易理解,就是為什么left是從i+1開始,而不是從別的地方開始
    是因為,每次遍歷的時候,都會把這個位置的所有情況給考慮到,后續的其它集合就不會包含這個元素

    //講數組進行排序
    Arrays.sort(nums);
    int n = nums.length;
    List<List<Integer>> ans = new ArrayList<>();
    for( int i= 0; i<n-2;i++){if(i>0&&nums[i]==nums[i-1]){continue;//代表這個重復了}int left = i+1;int right= n-1;int target = 0 - nums[i];while(left<right){if(nums[left]+nums[right]>target){right--;}else if(nums[left]+nums[right]<target){left++;}else {ans.add(Arrays.asList(nums[i], nums[left], nums[right]));//之后的話進行下一輪,因為可能還有重復,我們將left和right修改//比如[-2,-2,-2,-2,4,4,4,4,4],這個地方就有可能重復left++;while(left<right&&nums[left]==nums[left-1]){left++;}right--;while(left<right&&nums[right]==nums[right+1]) {right--;}}}
    }
    return ans;
    
  • 如何剪枝
    當我們確定了第一個數,發現它和這個排序后的數組中最大的兩個數相加都小于0的話,那么這個都不用看了,不可能會有等于0的情況,我們此時切換到下一個數
    當我們確定了第一個數,如果它和它緊挨著的兩個數(靠近它最小的數)相加大于0,那么后續都會大于0,直接跳過

  • if(nums[i]+nums[i+1]+nums[i+2]>0){break;
    }
    if(nums[i]+nums[n-1]+nums[n-2]<0){continue;
    }
    

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

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

相關文章

精通分類:解析Scikit-learn中的KNN、樸素貝葉斯與決策樹(含隨機森林)

在機器學習領域&#xff0c;分類任務占據核心地位。Scikit-learn作為Python的機器學習利器&#xff0c;提供了豐富高效的分類算法。現在進行初步探討三種經典算法&#xff1a;K最近鄰&#xff08;KNN&#xff09;、樸素貝葉斯&#xff08;Naive Bayes&#xff09;和決策樹&…

Galaxea機器人由星海圖人工智能科技有限公司研發的高性能仿人形機器人

Galaxea機器人是由星海圖人工智能科技有限公司研發的高性能仿人形機器人&#xff0c;具有多種型號&#xff0c;包括Galaxea R1和Galaxea R1 Pro。以下是關于Galaxea機器人的詳細介紹&#xff1a; GitHub官網 產品特點 高自由度設計&#xff1a;Galaxea R1是一款全尺寸仿人型機…

python基礎:用戶輸入和 while 循環

一、input() 函數的工作原理input() 函數讓程序暫停運行&#xff0c;等待用戶輸入一些文本。獲取用戶輸入后&#xff0c;Python 將其賦給一個變量&#xff0c;以便使用。message input("Tell me something, and I will repeat it back to you: ") print(message) 結…

開啟云服務器mysql本地連接(is not allowed to connect to this mysql server)

is not allowed to connect tothis mmysql server 阿里云上安裝的mysql&#xff0c;發現用本地電腦的navicat鏈接不上。通過了解知道了原因&#xff0c;小二在此寫了一篇&#xff0c;省的以后自己在碰到。 錯誤如圖。 aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTU4MTU1My8…

電腦的時間同步電池壞掉了,每次開機都要調整時間

電腦的時間同步的電池沒電了&#xff0c;每天開機時間都不對&#xff0c;要打開時間同步按鈕來設置時間解決方案1.找到這個設置并打開&#xff0c;實際上&#xff0c;要打開這個界面&#xff0c;時間才會同步&#xff0c;可能是我的電腦原因&#xff0c;所以我沒辦法打開這個就…

mycat在游戲中的使用場景(郵件表,mysql集群,而不是郵件服)

其實還有一種是SharingJDBC&#xff0c;而且之間在B站的同學也是說用這個&#xff0c;但是我們目前項目郵件中用的卻是: mycat&#xff0c;為什么呢&#xff1f;mycat其實是中間件&#xff0c;是需要獨立部署的&#xff0c;是數據庫服務器這塊的代理&#xff0c;在應用層的話很…

TP-Link Archer C50路由器曝安全漏洞,硬編碼DES密鑰可解密敏感配置

漏洞概述CERT協調中心&#xff08;CERT/CC&#xff09;發布安全公告&#xff0c;披露TP-Link Archer C50路由器存在編號為CVE-2025-6982的漏洞。該漏洞源于路由器固件中使用了硬編碼的DES&#xff08;數據加密標準&#xff09;解密密鑰&#xff0c;這一設計缺陷使大量家庭和小型…

番茄項目3:完成了項目的數據庫設計

今天抽了會時間設計了下表結構&#xff0c;并選定的使用的數據庫&#xff0c;經過調查&#xff0c;我決定還是把數據存在數據庫中&#xff0c;因為寫SQL是我擅長的。 最終我選擇使用python自帶的sqlite來實現這個工具&#xff0c;具體建表語句如下&#xff1a; 基于AI生成&…

11、read_object_model_3d 讀取點云

個人理解 read_object_model_3d 這個Halcon算子中的xyz_map_width這個參數設置的目的就是,把讀取的點云數據中每一個點的XYZ坐標,生成一個對應的二維圖像,其中圖像中的坐標值就對應每一個點的索引坐標,而圖像中的灰度值就對應xyz坐標??(因為得到的是三通道圖像)!!并且根…

【人工智能-17】機器學習:KNN算法、模型選擇和調優、樸素貝葉斯分類

上一期【人工智能-16】機器學習&#xff1a;概念、工具介紹、數據集、特征工程 文章目錄一 、KNN算法1. 應用理由2. 原理核心&#xff1a;距離度量 多數投票/平均3. 優點和缺點二、模型選擇和調優1.使用理由2.原理核心&#xff1a;數據劃分與性能平均3.超參數搜索4. 應用場景總…

關于繼承的一些知識(C++)

當我們想要設計幾個類分別記錄老師&#xff0c;學生的個人信息時會發現&#xff0c;像姓名、地址、身份證號、電話等等記錄基礎信息的成員變量是都具有的&#xff0c;重復定義會顯得冗余&#xff0c;但同時它們兩者又具有不同的記錄信息的成員變量&#xff0c;像學生需要記錄學…

永磁同步電機無速度算法--脈振方波注入法

一、原理介紹為了實現表貼式永磁電機的低速運行&#xff0c;研究一種基于高頻方波測試信號注入的無位置零低速傳感器控制策略。選取注入到觀測直軸的脈振高頻方波信號&#xff0c; 該信號注入方案可以有效避免旋轉信號注入法在轉子交軸分量引起轉矩脈動&#xff0c; 提高系統的…

VSCode Python 與 C++ 聯合調試配置指南

VSCode Python 與 C 聯合調試配置指南 為了實現 Python 與 C 的聯合調試&#xff0c;需要正確配置 launch.json 文件&#xff0c;具體配置如下&#xff1a; {// IntelliSense 支持查看屬性描述// 更多信息請參考: https://go.microsoft.com/fwlink/?linkid830387"version…

stm32和freeRtos的can總線

STM32內置bxCAN外設&#xff08;CAN控制器、拓展CAN&#xff09;&#xff0c;支持CAN2.0A和2.0B(全部的CAN)&#xff0c;可以自動發送CAN報文和按照過濾器自動接收指定CAN報文&#xff0c;程序只需處理報文數據而無需關注總線的電平細節波特率最高可達1兆位/秒&#xff0c;高速…

充電樁與照明“聯動”創新:智慧燈桿破解新能源基建難題

伴隨新能源汽車保有量呈現出極為迅猛的爆發式增長態勢&#xff0c;充電基礎設施的建設已然逐步成為城市發展進程中不可或缺的剛性需求。國家政策鼓勵推進充電設施同城市基礎設施展開一體化的建設工作&#xff0c;同時大力鼓勵“諸如路燈、監控桿這類市政設施去整合充電相關功能…

datagrip連接mysql數據庫過程以及遇到的問題

如果遇到這種錯誤說明時區錯誤&#xff0c;解決方法 jdbc:mysql://localhost:3306?serverTimezoneGMTdatagrip連接mysql數據庫下一步

Vue 3.5 defineModel:讓組件開發效率提升 10 倍

簡介 defineModel 是 Vue 3.4 引入并在 Vue 3.5 中穩定的一個組合式 API&#xff0c;它簡化了組件的雙向數據綁定實現。在此之前&#xff0c;實現雙向綁定需要手動定義 props 和 emits&#xff0c;而 defineModel 將這個過程自動化&#xff0c;讓代碼更加簡潔和直觀。 主要特…

性能測試-性能測試中的經典面試題一

一、核心概念與流程類性能測試的核心類型與區別負載測試&#xff1a;逐步加壓&#xff0c;探測系統閾值&#xff08;如最大TPS/響應時間&#xff09;。壓力測試&#xff1a;超越閾值施壓&#xff0c;驗證系統崩潰點及恢復能力。穩定性測試&#xff1a;80%~90%峰值壓力持續運行&…

華為昇騰芯片:多模態模型國產化的硬核突破

前言 在當今數字化時代&#xff0c;人工智能技術的發展日新月異&#xff0c;多模態模型作為 AI 領域的重要發展方向&#xff0c;正逐漸改變著人們與計算機交互的方式以及眾多行業的運作模式。多模態模型能夠處理多種類型的數據&#xff0c;比如圖像、文本、語音等&#xff0c;從…

阿里智能AI框架Playground,即學即用

Spring AI Alibaba Playground 是 Spring AI Alibaba 社區以 Spring AI Alibaba 和 Spring AI 為框架搭建的 AI 應用。包含完善的前端 UI 后端實現&#xff0c;具備對話&#xff0c;圖片生成&#xff0c;工具調用&#xff0c;RAG&#xff0c;MCP 等眾多 AI 相關功能。在 playg…