【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;
}
相关推荐
旖旎夜光8 小时前
LeetCode 3:无重复字符的最长子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
Navigator_Z11 小时前
LeetCode //C - 1192. Critical Connections in a Network
c语言·算法·leetcode
rannn_11111 小时前
【力扣hot100】链表专题下|138、148、23、146
java·算法·leetcode·链表·开发
hanlin0313 小时前
刷题笔记:力扣第189题-轮转数组
笔记·算法·leetcode
琥珀色糖13 小时前
leetcode hot100题(持续更新)移动零(双指针)
算法·leetcode·职场和发展·双指针·移动零
hanlin0313 小时前
动态规划专练:力扣第718、1143题
算法·leetcode·动态规划
看浪的路人15 小时前
第2讲:一致性哈希——数据分片与负载均衡
算法·哈希算法
hanlin0318 小时前
动态规划专练:力扣第1035、392题
算法·leetcode·动态规划
evans在进步19 小时前
LeetCode 34:在排序数组中查找元素的首尾位置——Java 两次二分查找详解
java·python·leetcode
杨航 AI21 小时前
** AI 面试算法 50 题清单**,不是单纯的 LeetCode 题号列表,而是按照“**考察概率 × 面试价值 × 你当前准备方向**”排序
算法·leetcode·面试