【leetcode】第三章 哈希表part02

454.四数相加II

java 复制代码
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
    HashMap<Integer,Integer> map = new HashMap<>();
    // 统计频率
    for (int i = 0; i < nums1.length; i++) {
        for (int j = 0; j < nums2.length; j++) {
            int num = nums1[i] + nums2[j];
            map.put(num,map.getOrDefault(num,0)+1);
        }
    }
    int cnt = 0;
    for (int i = 0; i < nums3.length; i++) {
        for (int j = 0; j < nums4.length; j++) {
            int restNum = nums3[i] + nums4[j];
            if (map.containsKey(-restNum)) {
                cnt += map.get(-restNum);
            }
        }
    }

    return cnt;
}

383. 赎金信

  • 使用map方法
java 复制代码
public boolean canConstruct(String ransomNote, String magazine) {
    // ransomNote是magazine的子串
    // aa aabcdea
    HashMap<Character,Integer> map = new HashMap<>();
    for (char c : ransomNote.toCharArray()) {
        map.put(c,map.getOrDefault(c,0)+1);
    }

    for (int i = 0; i < magazine.length(); i++) {
        char ch = magazine.charAt(i);

        if (map.containsKey(ch)) {
            map.put(ch,map.get(ch)-1);
        }
    }

    // 判断
    for (Integer cnt : map.values()) {
        if (cnt > 0) return false;
    }
    return true;

}
  • 使用数组方法
java 复制代码
public boolean canConstruct(String ransomNote, String magazine) {
    // ransomNote是magazine的子串
    // aa ab
    int[] hash = new int[26];

    for (int i = 0; i < magazine.length(); i++) {
        char ch = magazine.charAt(i);
        hash[ch-'a']++;
    }

    for (int i = 0; i < ransomNote.length(); i++) {
        char c  = ransomNote.charAt(i);
        hash[c-'a']--;
        if (hash[c-'a'] < 0) {
            return false;
        }
    }
    return true;

}

15 三数之和

java 复制代码
public List<List<Integer>> threeSum(int[] nums) {
    Arrays.sort(nums);
        List<List<Integer>> res = new ArrayList<>();
        for (int i = 0; i < nums.length-2; i++) {
            if (nums[i] > 0) break;
            if (i != 0 && nums[i] == nums[i-1]) {
                continue;
            }

            int left = i + 1;
            int right = nums.length-1;

            while (left < right) {
                int target = nums[i] + nums[left] + nums[right];
                if (target == 0) {
                    res.add(Arrays.asList(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--;
                }
                else if (target < 0) {
                    left++;
                }
                else {
                    right--;
                }
            }

        }
        return res;
}

18. 四数之和

java 复制代码
public List<List<Integer>> fourSum(int[] nums, int target) {
    // 输入:nums = [1,0,-1,0,-2,2], target = 0
    //输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
    List<List<Integer>> res = new ArrayList<>();
    Arrays.sort(nums);

    for (int i = 0; i < nums.length-3; i++) {
        // // 剪枝
        if (nums[i] > target && target >= 0) return res;
        if (i > 0 && nums[i] == nums[i-1]) continue;

        for (int j = i+1; j < nums.length-2; j++) {
            // 剪枝
            if (j > i+1 && nums[j] == nums[j-1]) continue;
            int left = j+1;
            int right = nums.length-1;

            while (left < right) {
                long num = (long)nums[i] + nums[j] + nums[left] + nums[right];
                if (num == target) {
                    res.add(Arrays.asList(nums[i],nums[j],nums[left],nums[right]));
                    while (left < right && nums[left] == nums[left+1]) left++;
                    while (left < right && nums[right] == nums[right-1]) right--;
                    left++;
                    right--;
                }
                else if (num < target) {
                    left++;
                }
                else {
                    right--;
                }
            }
        }
    }
    return res;
}
相关推荐
夏乌_Wx9 小时前
练题100天——DAY23:存在重复元素Ⅰ Ⅱ+两数之和
数据结构·算法·leetcode
萧鼎9 小时前
Python 图像哈希库 imagehash——从原理到实践
开发语言·python·哈希算法
ada7_15 小时前
LeetCode(python)108.将有序数组转换为二叉搜索树
数据结构·python·算法·leetcode
独自破碎E15 小时前
加油站环路问题
java·开发语言·算法·leetcode
Swift社区15 小时前
LeetCode 445 - 两数相加 II
算法·leetcode·职场和发展
墨染点香15 小时前
LeetCode 刷题【187. 重复的DNA序列】
算法·leetcode·职场和发展
2401_8414956417 小时前
【LeetCode刷题】最大子数组和
数据结构·python·算法·leetcode·动态规划·最大值·最大子数组和
鹿角片ljp17 小时前
力扣101.判断对称二叉树-推荐掌握递归
算法·leetcode·职场和发展
2401_8414956417 小时前
【LeetCode刷题】最小覆盖字串
数据结构·python·算法·leetcode·字符串·双指针·滑动窗口算法