454. 4Sum II
- 思路
- 遍历nums1,nums2,求和放进map
- key为和
- value为和出现次数
- 遍历nums3, nums4, 求target
- 在map里找target,如果有则累加其value值
- TC N2
-
java 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; map.put(temp, map.getOrDefault(temp, 0) + 1); } } for(int i: nums3){ for(int j : nums4){ int target = 0 - (i + j); if(map.containsKey(target)){ count += map.get(target); } } } return count; } }
- 遍历nums1,nums2,求和放进map
383. Ransom Note
- 思路
- 挺简单的直接上码了
-
java class Solution { public boolean canConstruct(String ransomNote, String magazine) { Map map = new HashMap<>(); for(char c: magazine.toCharArray()){ map.put(c, map.getOrDefault(c, 0) +1); } for(char c: ransomNote.toCharArray()){ if (!map.containsKey(c)){ return false; } map.put(c, map.get(c) - 1); if (map.get(c) < 0){ return false; } } return true; } }
15. 3Sum
- 思路:
- 三指针
-
java //直接用条件去重比较复杂,还是用个set比较方便 class Solution { public List> threeSum(int[] nums) { List> res = new ArrayList<>(); Arrays.sort(nums); if (nums[0] > 0) { return res; } for(int i = 0 ; i < nums.length; i++){ if(i >0 && nums[i] == nums[i - 1]){ continue; } int l = i + 1; int r = nums.length - 1; while (l < r){ int sum = nums[i] + nums[l] + nums[r]; if( sum > 0){ r --; }else if( sum < 0){ l ++; }else{ res.add(Arrays.asList(nums[i], nums[l], nums[r])); while(l < r && nums[r - 1] == nums[r]){ //去重 r--; } while(l < r && nums[l] == nums[l +1]){ // 去重 l++; } l++; r--; } } } return res; } } //set 去重法 class Solution { public List> threeSum(int[] nums) { Set> set = new HashSet<>(); Arrays.sort(nums); if (nums[0] > 0) { return res; } for(int i = 0 ; i < nums.length; i++){ if(i >0 && nums[i] == nums[i - 1]){ continue; } int l = i + 1; int r = nums.length - 1; while (l < r){ int sum = nums[i] + nums[l] + nums[r]; if( sum > 0){ r --; }else if( sum < 0){ l ++; }else{ set.add(Arrays.asList(nums[i], nums[l], nums[r])); l++; r--; } } } return new ArrayList(set); } }
18. 4Sum
- 思路
- 类似3Sum
-
java class Solution { public List> fourSum(int[] nums, int target) { List> res = new ArrayList<>(); Arrays.sort(nums); if(nums[0] > 0 && nums[0] > target ){ return res; } for(int i = 0; i< nums.length; i++){ 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 l = j + 1; int r = nums.length - 1; while( l < r){ int sum = nums[i] + nums[j] + nums[l] + nums[r]; if( sum > target){ r--; }else if (sum < target){ l++; }else{ res.add(Arrays.asList(nums[i],nums[j],nums[l],nums[r])); while(l < r && nums[r] == nums[r-1]){ r--; } while(l < r && nums[l] == nums[l+1]){ l++; } r--; l++; } } } } return res; } }
- Set去重
-
java class Solution { public List> fourSum(int[] nums, int target) { List> res = new ArrayList<>(); Set> set = new HashSet<>(); Arrays.sort(nums); if(nums[0] > 0 && nums[0] > target ){ return res; } for(int i = 0; i< nums.length; i++){ // 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 l = j + 1; int r = nums.length - 1; while( l < r){ int sum = nums[i] + nums[j] + nums[l] + nums[r]; if( sum > target){ r--; }else if (sum < target){ l++; }else{ set.add(Arrays.asList(nums[i],nums[j],nums[l],nums[r])); l++; r--; } } } } return new ArrayList(set); } }