代码随想录算法训练营第7天 | 哈希表和双指针结合、三数和四数之和
1.代码随想录算法训练营第2天 | 数组滑动窗口、螺旋打印2.代码随想录算法训练营第1天 | 数组二分法、数组双指针3.代码随想录算法训练营第3天 | 链表删除元素、翻转链表4.代码随想录算法训练营第4天 | 链表两两交换、删除倒N、链表相交、环形链表5.代码随想录算法训练营第6天 | 哈希表的应用、复习快慢指针思想
6.代码随想录算法训练营第7天 | 哈希表和双指针结合、三数和四数之和
7.代码随想录算法训练营第8天 | 复习字符串API、双指针8.代码随想录算法训练营第9天 | 复习字符串匹配、KMP9.代码随想录算法训练营第10天 | 复习队列和栈10.代码随想录算法训练营第11天 | 复习逆波兰表达式求值11.代码随想录算法训练营第13天 | 复习二叉树基础12.代码随想录算法训练营第14天 | 复习二叉树翻转13.代码随想录算法训练营第15天 | 二叉树进阶14.代码随想录算法训练营第16天 | 二叉树更加进阶15.代码随想录算法训练营第17天 | 复习二叉搜索树16.代码随想录算法训练营第18天 | 二叉搜索树进阶17.代码随想录算法训练营第20天 | 二叉搜索树中级18.代码随想录算法训练营第21天 | 二叉搜索树结尾19.代码随想录算法训练营第22天 | 开始复习回溯20.代码随想录算法训练营第23天 | 回溯进阶21.代码随想录算法训练营第24天 | 复习组合问题22.代码随想录算法训练营第25天 | 回溯问题完结23.代码随想录算法训练营第27天 | 初入贪心24.代码随想录算法训练营第28天 | 贪心进阶2024年7月9日
题454. 四数相加II
使用哈希表,分为两块,前两个数组找出各种情况,统计次数,时间复杂度为O($n^2$),后两个数组在找到各种情况的时候直接用哈希表去处前两个数组符合的相应次数即可。
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
HashMap<Integer,Integer> map1 = new HashMap<>();
int n = nums1.length;
int res=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
map1.put(nums1[i]+nums2[j],map1.getOrDefault(nums1[i]+nums2[j],0)+1);
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
int sum = nums3[i]+nums4[j];
res+=map1.getOrDefault(-sum,0);
}
}
return res;
}
}
题383. 赎金信
比较普通,使用map记录第一个,然后用第二个减,如果最后减不到0就说明不够,就返回false。写代码要注意是大于还是小于。
题15. 三数之和
比较难,改了90多分钟,一开始想的用双层set对三元组去重,后来时间太长,改为标准解法。当left右侧等于left,left就进1,right左侧等于right,则right也减1。
双指针思想,多复习几次。
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> list1 = new ArrayList<>();
for (int i = 0; i < nums.length - 2; i++){
if(nums[i]>0){
return list1;
}
if(i>0 && nums[i]==nums[i-1]){
continue;
}
int left=i+1,right=nums.length-1;
while(left<right){
int sum = nums[i]+nums[left]+nums[right];
if(sum<0){
left+=1;
}else if(sum>0){
right-=1;
}else{
ArrayList<Integer> list2 = new ArrayList<>();
list2.add(nums[left]);
list2.add(nums[i]);
list2.add(nums[right]);
list1.add(list2);
while(left<right && nums[left]==nums[left+1]){
left+=1;
}
while(left<right && nums[right]==nums[right-1]){
right-=1;
}
left+=1;
right-=1;
}
}
}
return list1;
}
}
题18. 四数之和
较难,写了快60分钟。基本上解法和三数之和一样,还是用双指针,外层用i和j控制,内层用left和right控制。
易错:
- 四个数字都要分别去重,i和left和right去重方式不变,要注意j的去重的起始不是0而是i+1。
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
Arrays.sort(nums);
List<List<Integer>> list1 = new ArrayList<>();
long sum=0;
for(int i=0;i<nums.length;i++){
if(i>0 && nums[i]==nums[i-1]){
continue;
}
for(int j=i+1;j<nums.length;j++){
if(j>i+1 && nums[j]==nums[j-1]){
continue;
}
int left=j+1;
int right = nums.length-1;
while(left<right){
sum = (long)nums[i]+nums[j]+nums[left]+nums[right];
if(sum<target){
left+=1;
}else if(sum>target){
right-=1;
}else{
ArrayList<Integer> list2 = new ArrayList<>();
list2.add(nums[i]);
list2.add(nums[j]);
list2.add(nums[left]);
list2.add(nums[right]);
list1.add(list2);
while(left<right && nums[right]==nums[right-1]){
right-=1;
}
while(left<right && nums[left]==nums[left+1]){
left+=1;
}
left+=1;
right-=1;
}
}
}
}
return list1;
}
}
合集:
代码随想录算法训练营
标签:
代码随想录
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!