重点:
class Solution {public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {Map map=new HashMap<>();int count=0;for(int i:nums1){for(int j:nums2){int temp=i+j;if(map.containsKey(temp)) map.put(temp,map.get(temp)+1);else map.put(temp,1);}}for(int i:nums3){for(int j:nums4){int temp=i+j;if(map.containsKey(0-temp)) count+=map.get(0-temp);}}return count;}
}
重点:与字母异位很类似!!!!只要有<0,就是false
class Solution {public boolean canConstruct(String ransomNote, String magazine) {int[] ints=new int[26];for(int i=0;iints[magazine.charAt(i)-'a']++;}for(int i=0;iints[ransomNote.charAt(i)-'a']--;}for(int i=0;iif(ints[i]<0) return false;}return true;}
}
重点:
class Solution {public List> threeSum(int[] nums) {List> list=new ArrayList<>();Arrays.sort(nums);for(int i=0;iif(nums[i]>0) return list;if(i>0&&nums[i]==nums[i-1]) continue;int left=i+1;int right=nums.length-1;while(leftint sum=nums[i]+nums[left]+nums[right];if(sum>0) right--;else if(sum<0) left++;else{list.add(Arrays.asList(nums[i], nums[left], nums[right]));while(left+11 & &nums[right]==nums[right-1]) right--;left++;right--;} }}return list;}
}
与上题的不同点:
class Solution {public List> fourSum(int[] nums, int target) {List> list=new ArrayList<>();Arrays.sort(nums);for(int i=0;i//如果该数>target并且该数为正数,这是不存在的if(nums[i]>0 && nums[i]>target) return list;if(i>0&&nums[i]==nums[i-1]) continue;for(int j=i+1;jif(j>i+1 && nums[j]==nums[j-1]) continue;int left=j+1;int right=nums.length-1;while(leftint sum=nums[i]+nums[j]+nums[left]+nums[right];if(sum>target) right--;else if(sumlist.add(Arrays.asList(nums[i], nums[j],nums[left], nums[right]));while(left+11&&nums[right]==nums[right-1]) right--;left++;right--;} }}}return list;}
}
454. 四数相加 与 18. 四数之和,15. 三数之和 的区别:
454 为四个独立的数组,只要找到A[i] + B[j] + C[k] + D[l] = 0就可以,不用考虑重复问题
18. 四数之和 ,15.三数之和 是一个数组(集合)里找到和为0的组合,难很多!