例题,leetcode454题454. 四数相加 II
基本解法
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
HashMap<Integer, Integer> map = new HashMap<>();
for(int n1: nums1){
for (int n2: nums2){
/*
判断表内是否存在键,若存在则值+1,若不存在则存入1
*/
if (map.containsKey(n1 + n2) == true){
map.put(n1 + n2, map.get(n1 + n2) + 1);
} else {
map.put(n1 + n2, 1);
}
}
}
int res = 0;
for (int n3: nums3){
for (int n4: nums4){
int neg = - (n3 + n4);
if (map.containsKey(neg)){
res += map.get(neg);
}
}
}
return res;
}
}
可以看到,在代码中两次调用了map.contains()
方法,这样做法虽然没有问题,效率也不错,但是较为繁琐,因此我们采用getOrDefault()
方法进行替代。getOrDefault()
方法源码如下
@Override
public V getOrDefault(Object key, V defaultValue) {
Node<K,V> e;
return (e = getNode(hash(key), key)) == null ? defaultValue : e.value;
}
可见返回值进行了判断,第一个参数为键,若存在该键,则返回对应的值,否则返回第二个参数,即默认参数。更新后的代码如下:
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
HashMap<Integer, Integer> map = new HashMap<>();
for(int n1: nums1){
for (int n2: nums2){
map.put(n1 + n2, map.getOrDefault(n1 + n2, 0) + 1);
}
}
int res = 0;
for (int n3: nums3){
for (int n4: nums4){
int neg = - (n3 + n4);
res += map.getOrDefault(neg, 0);
}
}
return res;
}
}
可见代码的冗余得到一定的解决,在执行时间上也比以前更优,如下图所示: