代码随想录算法训练营第七天【哈希表】454.四数相加II、383.赎金信、15.三数之和、18.四数之和
454.四数相加II
心得:这道题目感觉和昨天的最后一题【1.两数之和】思路挺像的。
1)先遍历2层for循环,求和,存入map
2)通过四数和为0这一信息,用0-sum,得到目标值target
3)去map中匹配,计算数量count
4)hashmap中key值不存在就添加键值对,key存在则对应的value值加1。map.getOrDefault(sum,0)+1
class Solution { public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) { Map<Integer,Integer> map = new HashMap<>(); int count = 0; for(int i=0;i<nums1.length;i++){ for(int j=0;j<nums2.length;j++){ int sum = nums1[i]+nums2[j]; map.put(sum,map.getOrDefault(sum,0)+1); } } for(int i=0;i<nums3.length;i++){ for(int j=0;j<nums4.length;j++){ int target = 0-nums3[i]-nums4[j]; if(map.containsKey(target)){ count = count+map.get(target); } } } return count; } }
383.赎金信
心得:和昨天的【242.有效的字母异位词】是一个思路
class Solution { public boolean canConstruct(String ransomNote, String magazine) { int[] arrays = new int[26]; for(int i=0;i<magazine.length();i++){ arrays[magazine.charAt(i) - 'a']++; } for(int i=0;i<ransomNote.length();i++){ arrays[ransomNote.charAt(i) - 'a']--; } for(int array:arrays){ if(array<0){ return false; } } return true; } }
字符串的遍历还有一种写法,string.toCharArray(),直接转换为数组:
for(char c : magazine.toCharArray()){
record[c - 'a'] += 1; }
15.三数之和
心得:使用双指针,重点是一开始要对数组做排序,移动过程中考虑去重。代码二刷再补
1)初始化二维动态数组,List<List<Integer>> result = new ArrayList<>()
2)对数组进行排序,Arrays.sort(arr)
3)直接进入下一次循环,continue
4)二维数组添加数据,result.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]))
18.四数之和
心得:思路和上个题差不多,二刷再来补代码
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?