Day9|四数之和 383. 赎金信 15.三数之和 18.四数之和

发布时间:2026/6/28 16:06:47

Day9|四数之和 383. 赎金信 15.三数之和 18.四数之和 454.四数只和1.补一个前提知识在没有 getOrDefault 之前我们如果要统计一个数字出现的次数通常需要这样写 javaif(map.containsKey(key)){map.put(key,map.get(key)1);}else{map.put(key,1);}或者更简洁一点的写法 javaIntegercountmap.get(key);if(countnull){map.put(key,1);}else{map.put(key,count1);}这样写代码比较啰嗦而且容易出错。 使用 getOrDefault 简化 使用 getOrDefault可以一行完成“取原值如果不存在则用0然后加1再放回去”的操作 java map.put(key,map.getOrDefault(key,0)1);这行代码的意思是 先根据 key 从 map 中取值如果 key 存在就取它的值否则取0。 将取到的值加1。 将结果放回 map 中。 这样无论是第一次出现还是再次出现都能正确累加计数。题解classSolution{publicintfourSumCount(int[]nums1,int[]nums2,int[]nums3,int[]nums4){//题目是要都多少个值满足//记录前两个数组的和 一级这个和的值出现的次数//然后和后面连个数组的和相加为0即可MapInteger,IntegermapnewHashMap();for(inti0;inums1.length;i){for(intj0;jnums2.length;j){intsumnums1[i]nums2[j];map.put(sum,map.getOrDefault(sum,0)1);}}intresult0;for(intb0;bnums3.length;b){for(intc0;cnums4.length;c){intsum2nums3[b]nums4[c];resultmap.getOrDefault(-sum2,0);}}returnresult;}}赎金信classSolution{publicbooleancanConstruct(StringransomNote,Stringmagazine){//因为都是小写字母 创建一个26个字母的哈西数组int[]recordnewint[26];if(ransomNote.length()magazine.length()){returnfalse;}for(chari:magazine.toCharArray()){record[i-a]1;}for(charj:ransomNote.toCharArray()){record[j-a]-1;}for(intc:record){if(c0){returnfalse;}}returntrue;}}15.三数之和classSolution{publicListListIntegerthreeSum(int[]nums){//创建一个数组ListListIntegerresultnewArrayList();Arrays.sort(nums);intnnums.length;for(inti0;in-2;i){if(nums[i]0){returnresult;}if(i0nums[i]nums[i-1]){continue;}intlefti1;intrightnums.length-1;while(leftright){intsumnums[i]nums[left]nums[right];if(sum0){right--;}elseif(sum0){left;}else{result.add(Arrays.asList(nums[i],nums[left],nums[right]));while(leftrightnums[left]nums[left1]){left;}while(leftrightnums[right]nums[right-1]){right--;}//left right 不过没有这一步的话 会一直leftright 会一直无线循环left;right--;}}}returnresult;}}18.四数之和思路 和三数之和思路相似 在外层加一层循环classSolution{publicListListIntegerfourSum(int[]nums,inttarget){//思路 在三数之和的基础上 再套上一层循环ListListIntegerresultnewArrayList();intnnums.length;Arrays.sort(nums);for(inti0;in-3;i){//第一个数去重if(i0nums[i]nums[i-1]){continue;}//剪枝if((long)nums[i]nums[i1]nums[i2]nums[i3]target){break;}if((long)nums[i]nums[n-1]nums[n-2]nums[n-3]target){continue;}for(intji1;jn-2;j){//第二个数去重if(ji1nums[j]nums[j-1]){continue;}intleftj1;intrightn-1;while(leftright){longsumnums[i]nums[j]nums[left]nums[right];if(sumtarget){right--;}elseif(sumtarget){left;}else{result.add(Arrays.asList(nums[i],nums[j],nums[left],nums[right]));while(rightleftnums[left]nums[left1]){left;}while(rightleftnums[right]nums[right-1]){right--;}left;right--;}}}}returnresult;}}

相关新闻