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即可。