【算法刷题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;
    }
}

总结

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

相关推荐
DARLING Zero two♡14 分钟前
【优选算法】Pointer-Slice:双指针的算法切片(下)
java·数据结构·c++·算法·leetcode
贵州晓智信息科技25 分钟前
如何优化求职简历从模板选择到面试准备
面试·职场和发展
游是水里的游1 小时前
【算法day19】回溯:分割与子集问题
算法
不想当程序猿_1 小时前
【蓝桥杯每日一题】分糖果——DFS
c++·算法·蓝桥杯·深度优先
南城花随雪。1 小时前
单片机:实现FFT快速傅里叶变换算法(附带源码)
单片机·嵌入式硬件·算法
dundunmm2 小时前
机器学习之scikit-learn(简称 sklearn)
python·算法·机器学习·scikit-learn·sklearn·分类算法
古希腊掌管学习的神2 小时前
[机器学习]sklearn入门指南(1)
人工智能·python·算法·机器学习·sklearn
波音彬要多做2 小时前
41 stack类与queue类
开发语言·数据结构·c++·学习·算法
KpLn_HJL3 小时前
leetcode - 2139. Minimum Moves to Reach Target Score
java·数据结构·leetcode
互联网杂货铺3 小时前
Postman接口测试:全局变量/接口关联/加密/解密
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·postman