算法训练营第七天|454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和 总结

454.四数相加

1.思路

与字母异位词相似,用nums1,num2构建哈希表,nums3,nums4查找哈希表。

2.为什么是两两构建?

两两构建时间复杂度最小,为n方。

3.为什么用map?

除了要存关键字,还要记录关键字出现的次数。

383. 赎金信

用map,与上一题类似,不多介绍。

15. 三数之和

重点在于对a,b,c的去重

因为想要得到的结果是数值组,而不是下标,所以可以对初始数组排序来更好的达到去重复的效果。

Arrays.sort(nums);

采用双指针法

1.对a的去重

if(i>=1&&nums[i]==nums[i-1]) continue;

2.对b的去重

while(slow<fast&&nums[slow]==nums[slow+1])
                    {
                        slow++;
                    }

3.对c的去重

while(slow<fast&&nums[fast]==nums[fast-1])
                    {
                        fast--;
                    }

对b,c的去重操作是在a+b+c=0成立时进行操作。且要已经添加过a,b,c后再进行。

遇到的问题

1.超出时间限制

原因:循环变量没有发生改变,无限循环。

2.答案错误

原因1:边界设定有问题

if(nums[i]>0) break;

原因2:去重b,c操作位置写错,没有考虑在什么条件下去重。

8. 四数之和 

此题在三数之和基础上加入一层循环

遇到的问题

1.java.lang.ArrayIndexOutOfBoundsException: Index 6 out of bounds for length 6

原因:指针移动方向错误,导致访问越界。

2.答案错误

原因:对b的去重操作有问题

 if(i>0&&nums[i]==nums[i-1]) continue;
 if(i>k+1&&nums[i]==nums[i-1]) continue;

原来忽略了a=b的情况,导致部分循环被continue;

3.答案错误

原因:sum值过大,超出int范围,将sum的类型改为long即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值