【算法 day06】LeetCode 454.四數相加II | 15. 三數之和 | 18. 四數之和

454.四數相加II

題目鏈接 | 文檔講解 |視頻講解 :?鏈接

?1.思路:
  • 0.定義一個count,計算最終出現的次數

  • 1.先遍歷nums1和nums2,求出兩者的和,map的key是和,value是出現的次數

  • 2.再遍歷nums3和nums4,求出0-兩者的和

  • 3.判斷map集合中是否出現 0-兩者的和,出現過count+map的value值,否則為count+0

【注】不能是count++,因為在記錄nums1和nums2,[1,2] [2,1] key=3的出現過2次,value存的是2,count+的是value值
?2.代碼:
 public  int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {int count=0;Map<Integer,Integer> map=new HashMap<>();//key是 nums1[i]+nums[j]的值  value是出現的次數for (int a : nums1) {for (int b : nums2) {
//                if(map.containsKey(a+b)){
//                    map.put(a+b,map.get(a+b)+1);
//                }else {
//                    map.put(a+b,1);
//                }//使用map.getOrDefault()方法,無需在if判斷,不存在,value為默認值0,存在則獲取對應的值map.put(a+b,map.getOrDefault(a+b,0)+1);}}for (int c : nums3) {for (int d : nums4) {
//                if(map.containsKey(0-c-d)){
//                    count+=map.get(0-c-d);
//                }count+=map.getOrDefault(0-c-d,0);}}return count;}

15. 三數之和

題目鏈接 | 文檔講解 |視頻講解:鏈接

?1.思路:
  • 1.先排序,第一個元素>0,直接返回空集合

  • 2.使用for循環+雙指針, 初始時左指針指向第二個元素,右指針指向最后一個元素

  • 3.去重操作,for循環的當前元素和上一個元素相等,continue eg: -1 -1 0 1 避免出現重復的三元數組 2個[-1 0 1]

  • 4.循環判斷條件,左右指針不能相等,因為求是3個元素相加和,相等成了2個元素的和,判斷三數之和num ,num>0,right--, num<0,left++ , num==0,收集三元數組,left++ right--? ? ? ??【注】==0時,去重判斷,left和left-1是否相等,right和right+1是否相等,避免出現 -1 0 0 1 1 ,2個[-1 0 1]

?2.代碼:
 public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> result=new ArrayList();//1.排序Arrays.sort(nums);for (int i = 0; i < nums.length; i++) {//第一個元素大于0,就不會出現和為0的數組了if(nums[i]>0){return result;}//三元數組不能重復,eg: -1 -1 0 1// 第一次循環 i指向第一個-1,得出了三元數組[-1 0 1]// 第二次循環  i指向第二個-1,再次得出了三元數組[-1 0 1],與題目要求不符,所以在這里要進行去重判斷//為什么不是和其下一個元素進行比較,而是和當前元素的前一個比較呢?if(i>0 && nums[i]==nums[i-1]){continue;}int left=i+1;int right=nums.length-1;while (left<right){int num=nums[i]+nums[left]+nums[right];//num>0,說明right需要變小if(num>0){right--;}//num>0,說明left需要變大if(num<0){left++;}if(num==0){List<Integer> list=new ArrayList<>();list.add(nums[i]);list.add(nums[left]);list.add(nums[right]);result.add(list);left++;right--;//因為left在上面已經+1,,所以需要與其前一個元素進行比較//避免出現-2 0 0 1 2 2  避免出現2個 [-2,0,2]while (left<right && nums[left]==nums[left-1]){left++;}//因為right在上面已經-1,所以需要與其后面一個元素進行比較while (left<right && nums[right]==nums[right+1]){right--;}}}}return  result;}

18. 四數之和

題目鏈接 | 文檔講解 |視頻講解:鏈接

?1.思路:
  • ?排序?

  • 2層for循環+雙指針

  • ?第一層for循環:判斷nums[i]>0 && nums[i]>target,返回空集合。必須判斷nums[i]>0,因為如果是負數,會出現 [-5,-1 ,0 ,0] target= -6 ,判斷當前元素和其上一個元素是否相等,相等,continue,退出本次循環

  • 第二層for循環:nums[i]+nums[j]>0 && nums[i]+nums[j]>target,break,退到上一層循環,避免出現 [-5,-1 ,0 ,1] target=-7 ,?判斷當前元素和其上一個元素是否相等,相等,continue,退出本次循環

  • ?while循環,左右指針的移動柜規則同三數之和,在這里不做贅述

?2.代碼:
 public  List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>> result =new ArrayList<>();//1.排序Arrays.sort(nums);//2層for循環+雙指針for (int i = 0; i < nums.length; i++) {// 【注】:不能直接判斷nums[i]>target 避免出現 [-5,-1 ,0 ,0]  target= -6  -5>-6但是會出現符合條件的四元數組,//數組中存在負數,是有可能會越加越小的if(nums[i]>0 && nums[i]>target){return  result;}//一級去重if(i>0 && nums[i]==nums[i-1]){continue;}for (int j = i+1; j < nums.length; j++) {// 【注】:不能直接判斷nums[i]+nums[j]>target,避免出現 [-5,-1 ,0 ,1]  target=-7  -5+(-1)>-7 但是會出現符合條件的四元數組if(nums[i]+nums[j]>0 && nums[i]+nums[j]>target){break;}//二級去重if(j>i+1 && nums[j]==nums[j-1]){continue;}int left=j+1;int right=nums.length-1;//下面同三元數組之和while (left<right){int num=nums[i]+nums[j]+nums[left]+nums[right];if(num>target){right--;}if(num<target){left++;}if(num==target){List<Integer> list=new ArrayList<>();list.add(nums[i]);list.add(nums[j]);list.add(nums[left]);list.add(nums[right]);result.add(list);left++;right--;while (left<right && nums[left]==nums[left-1]){left++;}while (left<right && nums[right]==nums[right+1]){right--;}}}}}return  result;}

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

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

相關文章

【項目實訓】【項目博客#09】HarmonySmartCodingSystem系統后端智能API檢索與代碼助手實現(6.2-6.15)

【項目實訓】【項目博客#09】HarmonySmartCodingSystem系統后端智能API檢索與代碼助手實現&#xff08;6.2-6.15&#xff09; 文章目錄 【項目實訓】【項目博客#09】HarmonySmartCodingSystem系統后端智能API檢索與代碼助手實現&#xff08;6.2-6.15&#xff09;項目博客概述一…

【JVM】- 類加載與字節碼結構3

類加載階段 1. 加載 加載&#xff1a;將類的字節碼載入方法區中&#xff0c;內部采用C的instanceKlass描述java類。如果這個類的父類還沒加載&#xff0c;則先加載父類加載和鏈接可能是交替運行的 通過全限定名獲取字節碼 從文件系統&#xff08;.class 文件&#xff09;、JA…

Qt藍圖式技能編輯器狀態機模塊設計與實現

設計概述 這個模塊是一個基于Qt的藍圖式技能編輯器狀態機&#xff0c;主要用于游戲開發中的技能狀態管理。核心功能包括&#xff1a; 狀態節點&#xff08;開始、結束、普通狀態&#xff09;的可視化 狀態間連線的繪制與管理 狀態轉換邏輯的可視化編輯 動作選擇與配置 核…

Unity AR識別物體的內容語音讀取+使用說明功能

因之前一直在開發項目&#xff0c;斷斷續續寫了一點博客&#xff0c;最后統一寫了一下博客記錄學習內容。 可以看到我的工作一直在進行。 目錄 一、識別內容語音讀取 二、點擊齒輪按鈕彈出使用說明界面 開發步驟 1. 創建齒輪按鈕 UI 2. 創建使用說明面板 UI 3. 編寫控制…

Unable to start embedded Tomcat

通常是由于xml文件配置錯誤導致 1. mapper 指向錯誤 <resultMap id"Waybill" type"c.Waybill"> 2. 字段類型錯誤 <result column"wstatus" property"stus" javaType"TINYINT"/>TINYINT 是數據庫類型<resu…

Mac電腦 充電限制保護工具 AlDente Pro

AlDente Pro一款充電限制保護工具&#xff0c;是可以限制最大充電百分比來保護電池的工具。 鋰離子和聚合物電池&#xff08;如 MacBook 中的電池&#xff09;在40&#xff05; 至 80&#xff05; 之間運行時&#xff0c;使用壽命最長。 始終將電池電量保持在 100&#xff05…

KungfuBot——基于物理約束和自適應運動追蹤的人形全身控制PBHC,用于學習打拳或跳舞(即RL下的動作模仿和運控)

前言 昨天618&#xff0c;我司「七月在線」同事朝陽為主力&#xff0c;我打雜&#xff0c;折騰了整整一天&#xff0c;終于可以通過VR搖操宇樹G1了——當然&#xff0c;搖操是為了做訓練數據的采集&#xff0c;從而方便 下一步的模型(策略)訓練&#xff0c;最終實現機器人自主…

Kafka多副本機制

副本和副本因子 Kafka 會為每個 Partition 創建多個副本。這些副本分布在不同的 Broker 上。副本確保了數據的冗余存儲&#xff0c;即使某個 Broker 宕機或失效&#xff0c;其他副本可以繼續提供服務。 副本因子指的是每個 Partition 有多少個副本。副本因子的設置決定了一個…

Vue3類似百度風格搜索框組件

Vue3百度風格搜索框組件&#xff0c;使用vue3進行設計&#xff0c;亦有vue3TS的版本。 vue3組件如下&#xff1a; <template><!-- 搜索組件容器 --><div class"search-container"><!-- 百度Logo - 新樣式 --><div class"logo-conta…

智凈未來:華為智選IAM以科技巧思優化家庭健康飲水體驗

在中國家庭中&#xff0c;凈水器早已成為廚房標配&#xff0c;但傳統凈水設備的使用體驗卻遠未達到理想狀態。根據《2023年中國家庭凈水器使用調研報告》顯示&#xff0c;超過65%的用戶對傳統凈水器存在不滿&#xff0c;主要痛點集中在功能單一、操作復雜、維護麻煩、噪音大、廢…

細說STM32單片機SPI-Flash芯片的FatFS移植

目錄 一、SPI-Flash芯片硬件電路 二、CubeMX項目基礎設置 1、RCC、SYS、Code Generator、USART6、NVIC 2、RTC 3、SPI2 4、GPIO 5、FatFS模式 6、FatFS參數設置概述 &#xff08;1&#xff09;Version組 &#xff08;2&#xff09;Function Parameters組 1&#x…

ubuntu 22.04 安裝部署logstash 7.10.0詳細教程

安裝部署logstash 7.10.0詳細教程 一、下載并安裝二、新建配置文件三、賦權文件權限四、檢測文件grok語法是否異常五、啟動服務六、安裝啟動常見問題 【背景】 整個elk安裝是基于ubuntu 22.04和jdk 11環境。logstash采用 *.deb方式安裝&#xff0c;需要服務器能聯網。ubuntu 22…

JVM對象創建與內存分配機制深度剖析

對象創建的主要流程 類加載檢查 在創建對象之前&#xff0c;JVM 首先會檢查該類是否已經加載、解析并初始化&#xff1a; 如果沒有&#xff0c;則會通過類加載機制加載類元信息&#xff08;Class Metadata&#xff09;到方法區。 這個過程包括&#xff1a;加載&#xff08;load…

Navicat 技術指引 | TiDB 的 AI 查詢交互功能

目前&#xff0c;Navicat 兩款工具支持對 TiDB 數據庫的管理開發功能&#xff1a;一款是旗艦款 Navicat Premium&#xff0c;另一款是其輕量化功能的 Navicat Premium Lite&#xff08;官方輕量級免費版&#xff09;。Navicat 自版本 17.1 開始支持 TiDB 7。它支持的系統有 Win…

以list為輸入條件,查詢數據庫表,java中的mapper層和mybatis層應該怎么寫?

根據一個 List 中的兩個字段 rangeCode 和 unitcd&#xff0c;查詢數據庫表 model_engineering_spatial_unit。這個需求在 Java MyBatis 項目中非常常見&#xff0c;下面我將為你詳細寫出 Mapper 接口&#xff08;Java&#xff09; 和 MyBatis XML 映射文件 的寫法。 ? 前提…

pyspark 創建DataFrame

from pyspark.sql import SparkSession from pyspark.sql import StructType, StructField, IntegerType,StringType spark SparkSession.builder.appName(test).getOrCreate() 1、 從列表中創建DataFrame data [(1,"alice"),(2,Blob),(3,Charlie)] columns [&qu…

Vim:從入門到進階的高效文本編輯器之旅

目錄 一、Vim簡介 二、Vim的基礎操作 2.1 進入和退出Vim 2.2 Vim的三種模式 2.3 基礎移動 三、Vim的高效編輯技巧 3.1 文本編輯 3.2 文本刪除與修改 3.3 復制與粘貼 四、Vim的進階使用 4.1 搜索與替換 4.2 寄存器與宏 4.3 插件與配置 五、結語 在編程界&#xff0…

Docker基礎理論與阿里云Linux服務器安裝指南

文章目錄 一、Docker核心概念二、阿里云環境準備三、Docker安裝與配置四、核心容器部署示例五、開發環境容器化六、運維管理技巧七、安全加固措施 一、Docker核心概念 容器化本質&#xff1a; 輕量級虛擬化技術&#xff0c;共享主機內核進程級隔離&#xff08;cgroups/namespac…

c#使用筆記之try catch和throw

一、try catch 一種報錯的捕捉機制&#xff0c;try塊里運行的代碼出現錯誤的時候就會去執行catch塊所以一般catch塊里都是把錯誤打印出來或者保存到log日志里&#xff1b; 1.1、具體使用 catch可以用&#xff08;&#xff09;來選擇捕捉什么類型的錯誤&#xff0c;一般用Exc…

(新手友好)MySQL學習筆記(9):索引(常見索引類型,查找結構的發展(二分查找法,二叉搜索樹,平衡二叉樹,B樹,B+樹))

目錄 索引 常見索引類型 B樹 二分查找法 二叉搜索樹和平衡二叉樹 B樹和B樹 索引 index&#xff0c;是存儲引擎用于快速找到數據的一種數據結構。 MySQL默認使用InnoDB存儲引擎&#xff0c;該存儲引擎是最重要&#xff0c;使用最廣泛的&#xff0c;除非有非常特別的原因需要使用…