代碼隨想錄-刷題第七天

454. 四數相加II

題目鏈接:454. 四數相加II

思路:哈希法。使用map集合,key存放a+b的值,value存放a+b出現的次數。使用兩層循環,循環前兩個數組,找出a+b,對map賦值。再用兩層循環,遍歷后兩個數組,找出符合map中符合目標的值,并通過value獲取出現的次數并累加。(其實就是將四數相加變成兩數相加,將時間復雜度從O(n4)降至O(n2)

時間復雜度:O(n2)

class Solution {public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {int count = 0;    // 統計a+b+c+d = 0 出現的次數Map<Integer, Integer> map = new HashMap<>();// 先遍歷前兩個數組,將a+b以及出現的次數放到map中for (int a : nums1) {for (int b : nums2) {map.put(a + b, map.getOrDefault(a + b, 0) + 1);}}// 然后遍歷后兩個數組,從map中找到符合條件的a+b并計數for (int c : nums3) {for (int d : nums4) {if (map.containsKey(0 - (c + d))) {count += map.get(0 - (c + d));}}}return count;}
}

383. 贖金信

題目鏈接:383. 贖金信

思路:哈希法。其實就是字母異位詞的擴展題目,思路同字母異位詞。

時間復雜度:O(n)

class Solution {public boolean canConstruct(String ransomNote, String magazine) {// 變向的字母異位詞int[] count = new int[26];for (int i = 0; i < ransomNote.length(); i++) {count[ransomNote.charAt(i) - 'a']++;}for (int i = 0; i < magazine.length(); i++) {count[magazine.charAt(i) - 'a']--;}for (int i : count) {if (i > 0) {   // 僅在此處有差別return false;}}return true;}
}

15. 三數之和

題目鏈接:15. 三數之和

思路:使用雙指針法。(本題的重點在于考察去重操作。)先對數組進行排序。使用i遍歷一遍數組,遍歷過程中,left初始為i+1,right初始為最后一個元素,然后如果left和right指向的元素符合目標值,將三個數放進結果中;如果不符合目標值,調整left和right的位置。

注意:要對三個數都進行去重操作。

i指向的是a,如果和前一個元素重復,就沒必要再進行遍歷了,跳過執行下一個元素。

left指向的是b,如果存入結果后,后一個元素仍然和當前元素相同,跳過后一個元素。

right指向的是c,如果存入結果后,前一個元素仍然和當前元素相同,跳過前一個元素。

通過雙指針將時間復雜度由O(n3)降至了O(n2)

時間復雜度:O(n2)

class Solution {public List<List<Integer>> threeSum(int[] nums) {// 雙指針法List<List<Integer>> res = new LinkedList<>();// 先進行排序Arrays.sort(nums);for (int i = 0; i < nums.length; i++) {// 如果當前最小的元素都大于0了,返回res就可以了if (nums[i] > 0) return res;// 對a去重,如果和前一個元素相同,說明已經判斷過了,執行下一個if (i > 0 && nums[i] == nums[i - 1]) continue;int left = i + 1, right = nums.length - 1;while (left < right) {if (nums[i] + nums[left] + nums[right] < 0) {left++;} else if (nums[i] + nums[left] + nums[right] > 0) {right--;} else {res.add(Arrays.asList(nums[i], nums[left], nums[right]));while (left < right && nums[left] == nums[left + 1]) { // 對b去重left++;}while (left < right && nums[right] == nums[right - 1]) { // 對c去重right--;}left++;right--;}}}return res;}
}

8. 四數之和

題目鏈接:8. 四數之和

思路:使用雙指針法,原理同三數之和。因為這次目標值可以指定為負數,所以要注意剪枝時的操作。用i和j確定a和b,用left和right尋找符合條件c和d。(同樣要注意,這四個數,每個數都要進行去重操作。)

不要判斷nums[k] > target 就返回了,三數之和 可以通過 nums[i] > 0 就返回了,因為 0 已經是確定的數了,四數之和這道題目 target是任意值。比如:數組是[-4, -3, -2, -1]target-10,不能因為-4 > -10而跳過。但是我們依舊可以去做剪枝,邏輯變成nums[i] > target && (nums[i] >= 0 || target >= 0)就可以了。

四數之和的雙指針解法是兩層for循環nums[k] + nums[i]為確定值,依然是循環內有left和right下標作為雙指針,找出nums[k] + nums[i] + nums[left] + nums[right] == target的情況。

那么一樣的道理,五數之和、六數之和等等都采用這種解法。

時間復雜度:O(n3)

class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {// 雙指針法,類似三數之和List<List<Integer>> res = new LinkedList<>();// 先排序Arrays.sort(nums);for (int i = 0; i < nums.length; i++) {if (nums[i] > target && (nums[i] >= 0 || target >= 0)){// 剪枝操作return res;}if (i > 0 && nums[i] == nums[i - 1]) { // 對a去重continue;}for (int j = i + 1; j < nums.length; j++) {if (j > i + 1 && nums[j] == nums[j - 1]) // 對b去重continue;int left = j + 1, right = nums.length - 1;while (left < right) {if (nums[i] + nums[j] + nums[left] + nums[right] < target) {left++;} else if (nums[i] + nums[j] + nums[left] + nums[right] > target) {right--;} else {res.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));while (left < right && nums[left] == nums[left + 1]) {// 對c去重left++;}while (left < right && nums[right] == nums[right - 1]) {// 對d去重right--;}left++;right--;}}}}return res;}
}

哈希表題目總結

從哈希表的理論基礎到數組、set和map的經典應用,把哈希表的全貌呈現出來。

同時也強調雖然map是萬能的,詳細介紹了什么時候用數組,什么時候用set

相信通過代碼隨想錄中的哈希表總結篇,大家可以對哈希表有一個全面的了解。


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

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

相關文章

唯創知音WT2605C-A001音頻藍牙語音芯片:小巧體積,高品質音頻播放的創新

在現今的科技繁榮時代&#xff0c;音頻技術作為人類感知世界的重要方式&#xff0c;已經變得越來越重要。唯創知音WT2605C-A001音頻藍牙語音芯片&#xff0c;以其卓越的特性和創新性&#xff0c;正在為音頻技術領域帶來一場革命。 首先&#xff0c;這款芯片以其極小的體積—僅…

chatGPT4機器學習數據后最終保留在機器里的是什么? 機器是怎么產生智能的? TensorFlow沒有直接開發出類似GPT-4這樣的模型

機器學習數據后最終保留在機器里的是機器學習模型。機器學習模型是機器學習系統中的核心&#xff0c;它是機器學習系統能夠進行推理和預測的基礎。 機器學習模型通常由參數組成。參數是機器學習模型的權重和偏差。機器學習系統通過訓練來學習這些參數。訓練是指讓機器學習系統…

webpack 打包優化

在vue.config.js中配置 下載 uglifyjs-webpack-plugin 包 const { defineConfig } require("vue/cli-service"); var path require("path");module.exports defineConfig({transpileDependencies: true,filenameHashing: false, // 去除Vue打包后.cs…

0003Java程序設計-ssm基于微信小程序的家教信息管理系統

文章目錄 摘要目 錄系統實現開發環境 編程技術交流、源碼分享、模板分享、網課分享 企鵝&#x1f427;裙&#xff1a;776871563 摘要 本文講述了基于微信小程序的家教信息管理系統的設計與實現。結合線上管理的特點&#xff0c;分析了家教信息管理系統的現狀&#xff0c;給出…

外匯天眼:香港監管機構對AMTD Global Markets Limited啟動法律訴訟

香港證監會&#xff08;SFC&#xff09;已經啟動了法律程序&#xff0c;要求首次審裁法院調查AMTD Global Markets Limited&#xff08;AMTD&#xff0c;目前以orientiert XYZ Securities Limited為名&#xff09;及其前高管在與首次公開發行&#xff08;IPO&#xff09;相關的…

【經典小練習】修改文件中的數據

文章目錄 &#x1f339;例子&#x1f33a;思路&#x1f6f8;方法一?報錯解決 &#x1f6f8;方法二 &#x1f339;例子 文本文件中有下面的數據 2-1-9-4-7-8 將文件中的數據進行排序&#xff0c;變成下面的數據 1-2-4-7-8-9 &#x1f33a;思路 要對這些數據進行排序&#xf…

智慧樓宇可視化視頻綜合管理系統,助力樓宇高效安全運行

隨著互聯網技術的進步和發展&#xff0c;智能化的樓宇建設也逐步成為人們選擇辦公場所是否方便的一個重要衡量因素。在智能化樓宇中&#xff0c;安全管理也是重要的一個模塊。得益于互聯網新興技術的進步&#xff0c;安防視頻監控技術也得到了快速發展并應用在樓宇的安全管理中…

Python武器庫開發-前端篇之html概述(二十八)

前端篇之html概述(二十八) html概述 HTML5是構建Web內容的一種語言描述方式。HTML5是互聯網的下一代標準&#xff0c;是構建以及呈現互聯網內容的一種語言方式&#xff0e;被認為是互聯網的核心技術之一。HTML產生于1990年&#xff0c;1997年HTML4成為互聯網標準&#xff0c;…

虹科Pico汽車示波器 | 汽車免拆檢修 | 2011款瑞麒M1車發動機起動困難、加速無力

一、故障現象 一輛2011款瑞麒M1車&#xff0c;搭載SQR317F發動機&#xff0c;累計行駛里程約為10.4萬km。該車因發動機起動困難、抖動、動力不足、熱機易熄火等故障進廠維修。用故障檢測儀檢測&#xff0c;發動機控制單元&#xff08;ECU&#xff09;中存儲有故障代碼“P0340相…

【Python 訓練營】N_2 打印乘法口訣表

題目 借助格式化輸出長方形、左上三角形、右上三角形、左下三角形、右下三角形5種格式的九九乘法口訣表。 答案 長方形格式 for i in range(1,10):for j in range(1,10):print(%d*%d%2d%(i,j,i*j),end ) # %2d 整數站兩個字節print()左上三角形 for i in range(1,10):for …

Vue框架學習筆記——事件處理

文章目錄 前文提要事件處理的解析過程樣例代碼如下&#xff1a;效果展示圖片&#xff1a;v-on:click"響應函數"v-on:click簡寫形式響應函數添加響應函數傳參占位符"$event"注意事項 前文提要 本人僅做個人學習記錄&#xff0c;如有錯誤&#xff0c;請多包…

2、git進階操作

2、git進階操作 2.1.1 分支的創建 命令參數含義git branch (git checkout -b)<new_branch> <old_branch>表示創建分支-d <-D>刪除分支 –d如果分支沒有合并&#xff0c;git會提醒&#xff0c;-D強制刪除-a -v查看分支-m重新命名分支commit id從指定的commi…

如何打造“面向體驗”的音視頻能力——對話火山引擎王悅

編者按&#xff1a;隨著全行業視頻化的演進&#xff0c;我們置身于一個充滿創新與變革的時代。在這個數字化的浪潮中&#xff0c;視頻已經不再只是傳遞信息的媒介&#xff0c;更是重塑了我們的交互方式和體驗感知。作為字節跳動的“能力溢出”&#xff0c;火山引擎正在飛速奔跑…

【React】路徑別名配置

路徑解析配置&#xff08;webpack&#xff09;&#xff0c;把 / 解析為 src/路徑聯想配置&#xff08;VsCode&#xff09;&#xff0c;VSCode 在輸入 / 時&#xff0c;自動聯想出來對應的 src/下的子級目錄 1. 路徑解析配置 安裝craco npm i -D craco/craco項目根目錄下創建配…

RK3588平臺 USB框架與USB識別流程

一.USB的基本概念 在最初的標準里&#xff0c;USB接頭有4條線&#xff1a;電源&#xff0c;D-,D,地線。我們暫且把這樣的叫做標準的USB接頭吧。后來OTG出現了&#xff0c;又增加了miniUSB接頭。而miniUSB接頭則有5條線&#xff0c;多了一條ID線,用來標識身份用的。 熱插拔&am…

9. Mysql 模糊查詢和正則表達式

一、模糊查詢 1.1 LIKE運算符 在MySQL中&#xff0c;可以使用LIKE運算符進行模糊查詢。LIKE運算符用于匹配字符串模式&#xff0c;其中可以使用通配符來表示任意字符或字符序列。 示例代碼 SELECT * FROM table_name WHERE column_name LIKE pattern;table_name&#xff1a…

最新AIGC創作系統ChatGPT網站源碼,Midjourney繪畫系統,支持GPT-4圖片對話能力(上傳圖片并識圖理解對話),支持DALL-E3文生圖

一、AI創作系統 SparkAi創作系統是基于OpenAI很火的ChatGPT進行開發的Ai智能問答系統和Midjourney繪畫系統&#xff0c;支持OpenAI-GPT全模型國內AI全模型。本期針對源碼系統整體測試下來非常完美&#xff0c;可以說SparkAi是目前國內一款的ChatGPT對接OpenAI軟件系統。那么如…

2023亞太杯數學建模B題完整原創論文講解

大家好呀&#xff0c;從發布賽題一直到現在&#xff0c;總算完成了2023亞太地區數學建模競賽B題玻璃溫室的微氣候調控完整的成品論文。 本論文可以保證原創&#xff0c;保證高質量。絕不是隨便引用一大堆模型和代碼復制粘貼進來完全沒有應用糊弄人的垃圾半成品論文。 論文共6…

第4章 C++多線程系統編程精要

第4章 C多線程系統編程精要 4.1 引言 學習多線程編程面臨的最大的思維方式的轉變有以下兩點&#xff1a; 當前線程可能隨時會被切換出去&#xff0c;或者說被搶占&#xff08;preempt&#xff09;了多線程程序中事件的發生順序不再有全局統一的先后關系 多線程程序的正確性…

軟著項目推薦 深度學習 opencv python 實現中國交通標志識別

文章目錄 0 前言1 yolov5實現中國交通標志檢測2.算法原理2.1 算法簡介2.2網絡架構2.3 關鍵代碼 3 數據集處理3.1 VOC格式介紹3.2 將中國交通標志檢測數據集CCTSDB數據轉換成VOC數據格式3.3 手動標注數據集 4 模型訓練5 實現效果5.1 視頻效果 6 最后 0 前言 &#x1f525; 優質…