代碼隨想錄第七天|● 454.四數相加II ● 383. 贖金信 ● 15. 三數之和 18.四數之和

?本文所有題目鏈接/文章講解/視頻講解:https://programmercarl.com/0454.%E5%9B%9B%E6%95%B0%E7%9B%B8%E5%8A%A0II.html

454.四數相加II

有四個數組,如果要遍歷則時間復雜度太大
可以選擇分組,a和b一組,c和d一組
這樣就可以等同于兩個數之和為0的情況了
只需要把a+b的所有可能和放入哈希表,然后c和d的和再找哈希表里能和它們加和等于0的
哈希表使用map,一個表示ab的和,一個表示次數

class Solution {
public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {//有四個數組,如果要遍歷則時間復雜度太大//則可以選擇分組,a和b一組,c和d一組//這樣就可以等同于兩個數之和為0的情況了//只需要把a+b的所有可能和放入哈希表,然后c和d的和再找哈希表里能和它們加和等于0的//哈希表使用map,一個表示ab的和,一個表示次數unordered_map<int,int> m;for(int i=0;i<nums1.size();i++){for(int j=0;j<nums2.size();j++){m[nums1[i]+nums2[j]]++;}}int count=0;for(int i=0;i<nums3.size();i++){for(int j=0;j<nums4.size();j++){int s=-(nums3[i]+nums4[j]);if(m.find(s)!=m.end()){count+=m[s];}}}return count;}
};

383. 贖金信

本題 和 242.有效的字母異位詞 是同樣類型的題目,思路都是一樣的,使用數組做哈希表

class Solution {
public:bool canConstruct(string ransomNote, string magazine) {//把magazine里的字母存入哈希表//再進行比對,如果有則對應數量-1,如果沒有則返回false//最終返回trueint s[26]={0};for(int i=0;i<magazine.size();i++){s[magazine[i]-'a']++;}for(int i=0;i<ransomNote.size();i++){if(s[ransomNote[i]-'a']==0){return false;}s[ransomNote[i]-'a']--;}return true;}
};

15. 三數之和

這題的主要難點在于如何去重,這題應該用雙指針,而不是哈希(哈希也可做,但是會比較麻煩

排序+雙指針(最優解):

先對數組排序(O(n log n))

固定一個數 nums[i],然后使用雙指針在剩余數組中尋找兩個數

  • 排序后可以方便地去重

  • 雙指針可以將兩數之和的時間復雜度從O(n2)降到O(n)

雙指針也需要去重,只是由于排序過,略微簡單了一點,下面記錄去重的思路:
?? ?1. 由于去重指的是不同的結果集不能有重復的三元組
?? ?2. 其中i指針指向a,是固定的,再去找符合條件的b和c,則固定數去重的思路是判斷nums[i]是否與上一位也就是nums[i-1]相同。這樣可以避免產生重復的三元組
?? ?3. 接著是找到解之和的去重:
? ? ? ? ? ?找到解之和,我們去看后面有無與b、c重復的元素,對于b來說是后面的元素(直到找到與當前位置不一樣的數),對于c是前面的元素(直到找到與當前位置不一樣的數)

?

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> result;sort(nums.begin(), nums.end());//先排序for(int i=0;i<nums.size();i++){if(nums[i]>0) break;if(i>0 && nums[i]==nums[i-1])continue;int left=i+1;int right=nums.size()-1;while(left < right){//遍歷尋找if(nums[i]+nums[right]+nums[left]>0) {right--;}else if(nums[i]+nums[right]+nums[left]<0){left++;}else{result.push_back(vector<int>{nums[i], nums[left], nums[right]});//去重while(right > left && nums[left]==nums[left+1]){left++;}//為什么是nums[left]=nums[left+1]???while(right > left && nums[right]==nums[right-1]){right--;}left++;right--;}}}return result;}
};

18. 四數之和

? ? ?這題和上一題思路一樣,就是多加了一層循環

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {//和三數之和類似的思路//先固定a和b的下標,再去找c和dvector<vector<int>> result;sort(nums.begin(),nums.end());for(int i=0;i<nums.size();i++){if(nums[i]>target && nums[i] >= 0) break;//if(i>0 && nums[i]==nums[i-1]){continue;}for(int j=i+1;j<nums.size();j++){if(nums[j] + nums[i] > target && nums[j] + nums[i] >= 0) break;//當target是負數時,只有nums[j] + nums[i] > targe這一個條件,不行,因為后面可能還有負數,所以要確保是正數if(j > i + 1 && nums[j]==nums[j-1]) continue;int left=j+1;int right=nums.size()-1;long long sum=(long long)target-(nums[i]+nums[j]);while(left<right){if((long long)nums[left]+nums[right]>sum){right--;}else if((long long)nums[left]+nums[right]<sum){left++;}else{result.push_back(vector<int>{nums[i],nums[j],nums[left],nums[right]});while(left<right && nums[right]==nums[right-1]){right--;}while(left<right && nums[left]==nums[left+1]){left++;}right--;left++;}}}}return result;}
};

總結

總體思路

本專題主要圍繞哈希表的應用展開,涵蓋了數組、set、map三種哈希表實現方式,解決了多種求和、計數、去重問題。核心思想是用空間換時間,將時間復雜度從O(n2)或O(n3)優化到O(n)或O(n2)。

核心解法

1. 454. 四數相加II

解法:分組哈希 + 互補查找

  • 將4數組分為2組:A+B 和 C+D

  • 用map存儲A+B的所有和及其出現次數

  • 查找C+D的和的相反數是否在map中

  • 時間復雜度:O(n2)

2. 383. 贖金信

解法:數組哈希表

  • 使用長度為26的數組作為簡易哈希表

  • 統計magazine中每個字母的出現次數

  • 遍歷ransomNote消耗字母計數

  • 關鍵點:數組比unordered_set更高效

3. 15. 三數之和

解法:排序 + 雙指針 + 去重

  • 先排序以便去重和使用雙指針

  • 固定一個數,轉化為兩數之和問題

  • 雙指針尋找互補值,同時處理去重

  • 難點:多重去重邏輯

4. 18. 四數之和

解法:雙循環 + 雙指針 + 去重

  • 三數之和的擴展,多一層循環

  • 固定兩個數,轉化為兩數之和問題

  • 注意整數溢出和負數情況下的提前終止條件

  • 關鍵點:使用long long防止溢出

?關鍵點

  1. 哈希表選擇原則

    • 需要統計次數 →?unordered_map

    • 只需要判斷存在 →?unordered_set

    • 鍵范圍小且連續 → 數組

  2. 去重技巧

    • 排序后跳過相同元素

    • 確定固定位置和移動指針

    • 在合適的位置進行去重(找到解后)

    • 注意去重條件的邊界判斷

  3. 優化策略

    • 分組處理降低復雜度

    • 雙指針替代多重循環

    • 提前終止不必要的計算(剪枝

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

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

相關文章

Vue3源碼reactivity響應式篇之computed計算屬性

概述 vue3中&#xff0c;computed函數用于表示計算屬性&#xff0c;有惰性求值、響應式追蹤依賴的特點。本文將介紹computed的實現原理以及其機制細節。 源碼解析 computed計算屬性和computed方法、ComputedRefImpl類以及refreshComputed方法有關。 computed方法 computed暴露給…

[嵌入式embed]Keil5燒錄后STM32不自動運行,復位才能運行

[嵌入式embed]Keil5燒錄后STM32不自動運行,復位才能運行Keil5-驗證“Reset and Run”功能是否生效參考文章Keil5-驗證“Reset and Run”功能是否生效 參考文章 Keil5燒錄后STM32不自動運行&#xff1f;必須復位才能啟動的終極解決方案

阿里云Qwen3系列模型部署微調評測

與阿里云一起輕松實現數智化讓算力成為公共服務&#xff1a;用大規模的通用計算&#xff0c;幫助客戶做從前不能做的事情&#xff0c;做從前做不到的規模。讓數據成為生產資料&#xff1a;用數據的實時在線&#xff0c;幫助客戶以數據為中心改變生產生活方式創造新的價值。模型…

北京魯成偉業 | 三屏加固筆記本電腦C156F3

在工業控制、應急指揮、測控及無人機作業等對設備穩定性與環境適應性要求較高的領域&#xff0c;一款性能均衡且堅固耐用的計算機往往能為工作效率提供有力支撐。三屏加固筆記本電腦C156F3便是針對這類需求設計的設備&#xff0c;憑借多方面的特性&#xff0c;可滿足不同場景下…

七彩氛圍燈芯片EH3A01RGB驅動芯片定時開關IC方案

?在現代智能家居和個性化照明領域&#xff0c;EH3A01-442A-A24F小夜燈定時芯片憑借其多功能、低功耗和靈活配置的特點&#xff0c;成為LED氛圍燈、小夜燈及便攜式照明方案的理想選擇。本文將深入解析該芯片的核心功能、電氣特性及應用場景&#xff0c;幫助開發者與用戶全面掌握…

Spring Boot 項目新增 Module 完整指南

1. 模塊化開發的重要性 在軟件開發中&#xff0c;隨著項目規模的不斷擴大&#xff0c;??模塊化設計??已成為提高代碼可維護性和可復用性的關鍵實踐。通過將大型項目拆分為多個獨立模塊&#xff0c;開發團隊可以??并行開發??不同功能組件&#xff0c;降低代碼耦合度&…

Git cherry-pick 與分支重置技術實現代碼健全性保障下的提交記錄精簡

代碼健全性保障&#xff1a;上市審查中的 Git 提交記錄整理方案&#xff08;核心功能提交篩選流程&#xff09; 一、背景與目的 我司正處于上市籌備階段&#xff0c;券商需對核心系統進行 Git 代碼審查&#xff0c;并基于提交記錄生成測試報告。由于原始提交記錄包含大量細節性…

前后端聯調時出現的一些問題記錄

服務器的ip沒有設置成所有ip都能訪問的&#xff0c;或防火墻沒開跨域問題&#xff08;剛開始異源&#xff0c;有這個問題&#xff0c;主要是前端做一下配置代理&#xff0c;后端也可以配置跨域資源共享&#xff08;CORS&#xff09;&#xff09;Configuration public class Cor…

數字圖像處理-設計生成一個半球

1 實驗題目設計生成一個半球&#xff08;matlab&#xff09;。2 程序源代碼%Hemisphere clear,clc,close all %Sphere radius R1; %Set grid number n30; theta (-n:2:n)/n*pi; phi ([0,0:2:n])/n*pi/2; cosphi cos(phi); cosphi(1) 0; cosphi(end) 0; sintheta sin(thet…

mac M1上安裝windows虛擬機報錯

Parallels版本是18.0.02 mac&#xff1a;arm系統15.6.1 自動獲取windows11下載&#xff0c;安裝的時候報錯&#xff0c;藍屏&#xff0c;是因為安裝的版本不對&#xff0c;猜測原因應該是18.0.02不支持最新版的windows11&#xff0c;需要更新最新版的Parallels。 解決方案&am…

基于R語言機器學習方法在生態經濟學領域中的實踐技術應用

近年來&#xff0c;人工智能領域已經取得突破性進展&#xff0c;對經濟社會各個領域都產生了重大影響&#xff0c;結合了統計學、數據科學和計算機科學的機器學習是人工智能的主流方向之一&#xff0c;目前也在飛快的融入計量經濟學研究。表面上機器學習通常使用大數據&#xf…

第01章 初識MySQL與mysql8.0的安裝

初識 MySQL 文章目錄初識 MySQL引言一、數據庫基礎1.1 什么是數據庫1.2 表1.3 數據類型1.4 主鍵二、數據庫技術構成2.1 數據庫系統2.2 SQL 語言2.2.1 數據定義語言&#xff08;DDL&#xff09;2.2.2 數據操作語言&#xff08;DML&#xff09;2.2.3 數據查詢語言&#xff08;DQL…

【數據結構基礎習題】-1- 數據結構基本操作

一、順序表和鏈表習題 1. 順序表就地逆置#include <stdio.h> // 定義順序表結構 #define MAXSIZE 100 typedef struct {int data[MAXSIZE];int length; } SqList; // 就地逆置順序表 void reverseList(SqList *L) {int i, temp;for (i 0; i < L->length / 2; i) {…

【Java實戰?】從0到1:Spring Boot Web開發與接口設計實戰

目錄一、Spring Boot Web 基礎配置1.1 Web 起步依賴&#xff08;spring-boot-starter-web 導入與核心組件&#xff09;1.2 內置服務器配置&#xff08;Tomcat 端口、線程池、連接超時設置&#xff09;1.3 靜態資源訪問&#xff08;靜態資源存放路徑、自定義資源映射&#xff09…

房屋安全鑒定機構評價

房屋安全鑒定機構評價&#xff1a;如何選擇專業可靠的檢測服務在建筑行業快速發展的今天&#xff0c;房屋安全鑒定已成為保障建筑安全、預防事故的重要環節。面對市場上眾多的房屋安全鑒定機構&#xff0c;如何科學評價并選擇一家專業可靠的服務提供方&#xff0c;是許多業主、…

【算法專題訓練】19、哈希表

1、哈希表基礎知識 以鍵值對的方式進行數據存儲優點&#xff1a;哈希表數據結構在插入、刪除或查找一個元素時&#xff0c;都只需要O(1)的時間 哈希表設計三要點&#xff1a; 為了快速確定一個元素在哈希表中的位置&#xff0c;可以使用一個數組&#xff0c;元素的位置為他的…

某光伏電力監控系統網絡安全監測項目:智能組網技術優化方案實踐

背景與挑戰隨著光伏電力行業的快速發展&#xff0c;光伏電站的規模和分布范圍日益擴大。電力監控系統作為光伏電站的核心平臺&#xff0c;其網絡安全直接關系到電力生產的穩定性與可靠性。然而&#xff0c;光伏場站通常分布在偏遠地區&#xff0c;網絡環境復雜&#xff0c;傳統…

GEE訓練教程:基于Landsat 8衛星影像識別并提取指定區域內無云覆蓋的區域多邊形,最終導出為矢量文件

簡介 本文使用Google Earth Engine平臺,通過Landsat 8衛星影像識別并提取指定區域內無云覆蓋的區域多邊形,最終導出為矢量文件。主要步驟包括:定義研究區域、創建云檢測算法、篩選高質量影像、將無云區域轉換為矢量多邊形,并進行可視化檢查和數據導出。 使用Google Earth…

UniApp 頁面通訊方案全解析:從 API 到狀態管理的最佳實踐

在 UniApp 跨端開發中&#xff0c;組件與頁面間的通訊是核心需求。無論是父子組件交互、跨頁面數據傳遞&#xff0c;還是全局狀態共享&#xff0c;選擇合適的通訊方案直接影響代碼的可維護性和性能。本文將系統對比 uni.$emit 系列 API、狀態管理庫&#xff08;Vuex/Pinia&…

【c++進階系列】:萬字詳解AVL樹(附源碼實現)

&#x1f525; 本文專欄&#xff1a;c &#x1f338;作者主頁&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客勵志語錄&#xff1a; 路在腳下延伸時&#xff0c;不必追問終點何在。你邁出的每一步&#xff0c;都在重新定義世界的邊界 ★★★ 本文前置知識&#xff1a; …