代码随想录算法训练营第7天|四数相加II、赎金信、三数之和
lc454四数相加||
思路
使用map将时间复杂度将至n^2
代码
class Solution { public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) { int res = 0; Map<Integer, Integer> map = new HashMap<>(); for (int num1 : nums1){ for (int num2 :nums2){ map.put(num1+num2, map.getOrDefault(num1+num2, 0)+1); } } for (int num3 : nums3){ for (int num4 : nums4){ res += map.getOrDefault(-num3-num4, 0); } } return res; } }
lc383赎金信
思路
map的简单应用
代码
class Solution { public boolean canConstruct(String ransomNote, String magazine) { Map<Character, Integer> map = new HashMap<>(); char[] mag = magazine.toCharArray(); for (char ch : mag){ map.put(ch, map.getOrDefault(ch,0)+1); } char[] rand = ransomNote.toCharArray(); for (char ch : rand){ map.put(ch, map.getOrDefault(ch,0)-1); } for (int item : map.values()){ if (item < 0){ return false; } } return true; } }
lc15三数之和
思路
一个循环遍历(确定一个数),双指针确定另外两个数,注意添加成功后的两元素去重和循环遍历中的定元素去重
代码
class Solution { public List<List<Integer>> threeSum(int[] nums) { Arrays.sort(nums); List<List<Integer>> res = new ArrayList<>(); if (nums[0] > 0){ return res; } for (int k = 0; k < nums.length-2; k++){ int i = k + 1, j = nums.length-1; if (k > 0 && nums[k] == nums[k-1]){ continue; } while (i < j){ if (nums[k] + nums[i] + nums[j] == 0){ res.add(Arrays.asList(nums[k],nums[i],nums[j])); while(i < j && nums[j]==nums[j-1]){ j--; } while(i < j && nums[i]==nums[i+1]){ i++; } j--; i++; } else if (nums[k] + nums[i] + nums[j] > 0){ j--; } else { i++; } } } return res; } }
lc18四数之和
思路
三数之和的基础上多加一层循环,注意去重时的条件
代码
class Solution { public List<List<Integer>> fourSum(int[] nums, int target) { Arrays.sort(nums); // 排序数组 List<List<Integer>> res = new ArrayList<>(); // 结果集 for (int k = 0; k < nums.length; k++) { if (nums[k] > target && nums[k] >= 0){//非负且大于target,加上就会超 continue; } if (k > 0 && nums[k] == nums[k-1]){//nums[k]去重 continue; } for (int i = k+1; i < nums.length; i++){ if (nums[k]+nums[i] > target && nums[k]+nums[i] >= 0){ continue; } if (i > k+1 && nums[i] == nums[i-1]){ continue; } int left = i+1, right = nums.length-1; while (left < right){ long sum = (long) nums[k] + nums[i] + nums[left] + nums[right]; if (sum > target){ right--; } else if (sum < target){ left++; } else { res.add(Arrays.asList(nums[k], nums[i], nums[left], nums[right])); while (left <right && nums[left] == nums[left+1]){ left++; } while (left <right && nums[right] == nums[right-1]){ right--; } left++; right--; } } } } return res; } }