刷题笔记02:今天将前几天刷的一道题才解决掉,感觉挺有收获的
leetcode 1865题:题目描述如下
输入示例:
题目数据范围:
解题思路:
1.刚一看题,先设数组1为A,数组2为B。那么题目的意思就是求A[i]+B[j]=C时,一共有多少种组合情况。感觉很简单,这直接for循环就结束了呀。再一看这好歹是个中等题,哪能这么简单。一看数据量,就明白了,数组的长度和操作的数量和元素的值都很大,用暴力搜索肯定行不通;
2.针对长的无序数组,且有重复元素时,索引其每个元素,首先想到将其用HashMap来存储,这样在索引时就能提升效率,整体思路就是这样;
3.首先在FindSumPairs(nums1,nums2)中进行初始化,即一些赋初值的操作,这里主要的步骤就是将数组2转存到HashMap里。关于这里,也有一些需要注意的东西,如果你要把每个元素的索引存下来,那就要用HashMap<Integer,HashSet>来存,结果在提交时,就会发现超时了;因为题目中给的输入里是有对数组2元素进行某位置元素加的操作。所以,如果连索引都存,那每次改变数组2的元素,我们也要对应改变map里的value,这里要先删除在改变,每次都需要2次调用方法,即:
1.map.get(value).remove(index);//即该index位置的元素改变,需要将之前存到map里的索引去掉
2.map.put(value,set);//再将新值的索引添加到map里;这里是简写了,具体的代码就不重复了
可以看到这样写的话,在大量输入时,是很耗费时间的。所以,就需要转换思路:题目只是要统计满足条件的角标对数量,又不需要输出他们的索引,所以只需要记录数组2中每个元素出现的次数,存到map中即可。就能节省大量时间。
代码实现如下:
class FindSumPairs {
private int[] nums1;
private int[