算法day06 | Java | 哈希表 | LeetCode 454,383,15,18,X数之和

52 阅读2分钟

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;
    }
}

正确解法:

image.png

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;
    }
}

image.png

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;
    }
}