重点:
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
Map<Integer, Integer> 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;i<magazine.length();i++){
ints[magazine.charAt(i)-'a']++;
}
for(int i=0;i<ransomNote.length();i++){
ints[ransomNote.charAt(i)-'a']--;
}
for(int i=0;i<ints.length;i++){
if(ints[i]<0) return false;
}
return true;
}
}
重点:
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> list=new ArrayList<>();
Arrays.sort(nums);
for(int i=0;i<nums.length;i++){
if(nums[i]>0) return list;
if(i>0&&nums[i]==nums[i-1]) continue;
int left=i+1;
int right=nums.length-1;
while(left<right){
int 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+1<nums.length && nums[left]==nums[left+1]) left++;
while(right>1 & &nums[right]==nums[right-1]) right--;
left++;
right--;
}
}
}
return list;
}
}
与上题的不同点:
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> list=new ArrayList<>();
Arrays.sort(nums);
for(int i=0;i<nums.length;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;j<nums.length;j++){
if(j>i+1 && nums[j]==nums[j-1]) continue;
int left=j+1;
int right=nums.length-1;
while(left<right){
int sum=nums[i]+nums[j]+nums[left]+nums[right];
if(sum>target) right--;
else if(sum<target) left++;
else{
list.add(Arrays.asList(nums[i], nums[j],nums[left], nums[right]));
while(left+1<nums.length&&nums[left]==nums[left+1]) left++;
while(right>1&&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的组合,难很多!