Java语法
HahMap - getOrDefault
map1.getOrDefault(nums1[i]+nums2[j],0)
Arrays.sort(nums);
454.四数相加II
解答错误:对map中的getOrDefault不熟悉
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
Map<Integer,Integer>map1 = new HashMap<Integer,Integer>();
int n = nums1.length;
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
map1.put(nums1[i]+nums2[j],map1.getOrDefault(nums1[i]+nums2[j],0));
}
}
int count = 0;
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
int sum = -(nums3[i]+nums4[j]);
if(map1.containsKey(sum)) {
count += map1.get(sum);
}
}
}
return count;
}
}
正确解法:
383. 赎金信
正确解法:
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
Map<Character,Integer>map1 = new HashMap<>();
for(int i=0; i<magazine.length(); i++) {
char c = magazine.charAt(i);
map1.put(c,map1.getOrDefault(c,0)+1);
}
for(int j=0; j<ransomNote.length(); j++) {
char c = ransomNote.charAt(j);
if(map1.containsKey(c)) {
map1.put(c,map1.get(c)-1);
if(map1.get(c)<0) { return false; }
} else {
return false;
}
}
return true;
}
}
15. 三数之和
先排序,可以排序 是因为不要求返回下标,只计数
去重逻辑应该放在找到一个三元组之后,对b 和 c去重
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> ans = new ArrayList<>();
Arrays.sort(nums);
int left,right,sum;
for(int i=0; i<nums.length; i++) {
if(nums[i] > 0) return ans;
if(i>0 && nums[i] == nums[i-1]) continue;
left = i+1;
right = nums.length-1;
while(left < right) {
sum = nums[i]+nums[left]+nums[right];
if(sum > 0) {
right--;
} else if(sum < 0) {
left++;
} else {
ans.add(Arrays.asList(nums[i], nums[left], nums[right]));
// 去重逻辑应该放在找到一个三元组之后,对b 和 c去重
//去重
while(left<right && nums[left+1]==nums[left]) left++;
while(left<right && nums[right-1]==nums[right]) right--;
left++;
right--;
}
}
}
return ans;
}
}
18. 四数之和
出错点
① List<List<Integer>> res = new ArrayList<>();
②Arrays.sort(nums); `Arrays有s
③ 数组下标 注意范围 if(i>0 && nums[i]==nums[i-1]) continue;
④ long sum = (long)nums[i]+nums[j]+nums[left]+nums[right]; 这里要写long
⑤ Arrays.asList的使用方法:res.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> res = new ArrayList<>(); //ArrayList拼写
Arrays.sort(nums); //Arrays有s
for(int i=0; i<nums.length; i++) {
if(nums[i]>0 && nums[i]>target) {return res;}
if(i>0 && nums[i]==nums[i-1]) continue; //这里要i>0
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) { //while
long sum = (long)nums[i]+nums[j]+nums[left]+nums[right]; //long
if(sum > target) {
right--;
} else if(sum < target) {
left++;
} else {
res.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));//使用方法
while(left<right && nums[left+1]==nums[left]) left++;
while(left<right && nums[right-1]==nums[right]) right--;
left++;
right--;
}
}
}
}
return res;
}
}