【算法刷题day7】Leetcode:454. 四数相加 II、383. 赎金信、15. 三数之和、18. 四数之和

文章目录

草稿图网站
java的Deque

Leetcode 454. 四数相加 II

题目: 454. 四数相加 II
解析: 代码随想录解析

解题思路

使用HashMap来记录nums1+nums2的所有情况,寻找-(nums3+nums4)的次数。

代码

java 复制代码
class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int numI : nums1)
            for(int numJ : nums2){
                int sum = numI + numJ;
                map.put(sum, map.getOrDefault(sum, 0) + 1);//getOrDefault如果找到返回sum,否则返回0
            }
        int res = 0;
        for (int numI : nums3)
            for (int numJ : nums4){
                int sum = numI + numJ;
                res += map.getOrDefault(-sum, 0);
            }
        return res;
    }
}

总结

暂无

Leetcode 383. 赎金信

题目: 383. 赎金信
解析: 代码随想录解析

解题思路

HashMap来记录和删除。

代码

java 复制代码
class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < magazine.length(); i++){
            int c = magazine.charAt(i);
            map.put(c, map.getOrDefault(c, 0) + 1);
        }
        for (int i = 0; i < ransomNote.length(); i++){
            int c = ransomNote.charAt(i);
            int count = map.getOrDefault(c, 0);
            if (count == 0)
                return false;
            map.put(c, count - 1);
        }
        return true;
    }
}

总结

这题可以用Hash数组来解决

java 复制代码
class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        int[] hash = new int[26];
        for (char c : magazine.toCharArray())
            hash[c - 'a']++;
        for (char c : ransomNote.toCharArray()){
            if (hash[c - 'a'] == 0)
                return false;
            hash[c - 'a']--;
        }
        return true;
    }
}

Leetcode 15. 三数之和

题目: 15. 三数之和
解析: 代码随想录解析

解题思路

自己没想出来,参考了Carl的代码。

遍历数组,设定最小的i,然后使用双指针寻找到所有可能的结果。

代码

java 复制代码
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        Arrays.sort(nums);
        for (int i = 0; i < nums.length; 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 sum = nums[i] + nums[left] + nums[right];
                if (sum < 0){
                    left++;
                }else if (sum > 0){
                    right--;
                }else{
                    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--;
                }
            }
            while (i < nums.length - 1 && nums[i] == nums[i+1])
               i++;
        }
        return res;
    }
}

总结

暂无

Leetcode 18. 四数之和

题目: 18. 四数之和
解析: 代码随想录解析

解题思路

两层循环后,双指针遍历。

continue条件要想到元素大于target的同时,要大于等于0才能break

代码

java 复制代码
class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> res = new ArrayList<>();
        Arrays.sort(nums);
        for (int i = 0; i < nums.length; i++){
            if (nums[i] > target && nums[i] >= 0)
                break;
            if (i > 0 && nums[i] == nums[i - 1])
                continue;
            for (int j = i + 1; j < nums.length; j++){
                if (nums[i] + nums[j] > target && nums[i] + nums[j] >= 0)
                    break;
                if (j > i + 1 && nums[j] == nums[j - 1])
                    continue;
                int left = j + 1;
                int right = nums.length - 1;
                while (left < right){
                    int sum = nums[i] + nums[j] + nums[left] + nums[right];
                    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] == nums[left+1])
                            left++;
                        while (left < right && nums[right] == nums[right-1])
                            right--;
                        left++;
                        right--;
                    }
                }
            }
        }
        return res;
    }
}

总结

要想到和三数之和是一个道理

相关推荐
王哈哈^_^24 分钟前
【数据集】【YOLO】【VOC】目标检测数据集,查找数据集,yolo目标检测算法详细实战训练步骤!
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·pyqt
星沁城26 分钟前
240. 搜索二维矩阵 II
java·线性代数·算法·leetcode·矩阵
脉牛杂德42 分钟前
多项式加法——C语言
数据结构·c++·算法
legend_jz44 分钟前
STL--哈希
c++·算法·哈希算法
kingmax542120081 小时前
初三数学,最优解问题
算法
一直学习永不止步1 小时前
LeetCode题练习与总结:赎金信--383
java·数据结构·算法·leetcode·字符串·哈希表·计数
小刘|2 小时前
《Java 实现希尔排序:原理剖析与代码详解》
java·算法·排序算法
jjyangyou2 小时前
物联网核心安全系列——物联网安全需求
物联网·算法·安全·嵌入式·产品经理·硬件·产品设计
van叶~2 小时前
算法妙妙屋-------1.递归的深邃回响:二叉树的奇妙剪枝
c++·算法
简简单单做算法2 小时前
基于Retinex算法的图像去雾matlab仿真
算法·matlab·图像去雾·retinex