原本以为很难,就用了笨方法,结果答案就是笨方法,唯一比较容易入坑的一点是,刚开始用的list来记录两个数组的和的相反数,然后再遍历令两个数组和,并判断list中是否存在这个目标和,如果有,元组数加一,结果显示,这种方法得到的元组数目比真实的要少,后来想了一下,如果原来的list中存在多个相同的目标,其实每出现一次这个目标都应该元组数目加一,因此应该是元组数加上目标和的数目,而不是仅仅加一,后期用hashmap的value记录数目,key记录和,最后解决了这个题。
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
Map<Integer,Integer>map=new HashMap<>();
int n=nums1.length;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
int tem=-nums1[i]-nums2[j];
map.put(tem,map.getOrDefault(tem,0)+1);
}
}
int result=0;
for(int t=0;t<n;t++){
for(int k=0;k<n;k++){
if(map.containsKey(nums3[t]+nums4[k])){
result+=map.get(nums3[t]+nums4[k]);
}
}
}
return result;
}
}
# 383. 赎金信
简单题,都是小写字母,所以new int[26];记录字母出现的次数,因为没加前面的长度判断,导致算法通过的时间对于官方久了。
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
if (ransomNote.length() > magazine.length()) {
return false;
}
int [] tem=new int[26];
for(int i=0;i<magazine.length();i++){
tem[magazine.charAt(i)-'a']++;
}
for(int j=0;j<ransomNote.length();j++){
tem[ransomNote.charAt(j)-'a']--;
if(tem[ransomNote.charAt(j)-'a']<0){
return false;
}
}return true;
}
}