代码随想录算法训练营Day7|454.四数相加II、383.赎金信、15.三数之和、18.四数之和

一、454 四数相加II

  1. 题目链接:https://leetcode.cn/problems/4sum-ii/

  1. 思路:先遍历两个数组,将它们的两两之和作为key,和出现的次数作为value填入map当中,然后遍历另外两个,将0-两数之和作为key去寻找,寻找到的value加在result上。

  1. 代码:

var fourSumCount = function(nums1, nums2, nums3, nums4) {
    var n = nums1.length;
    var map = new Map();
    for (let i=0; i<n; i++) {
        for (let k=0; k<n; k++) {
            map.set(nums1[i]+nums2[k], map.has(nums1[i]+nums2[k]) ? map.get(nums1[i]+nums2[k]) + 1 : 1);
        }
    }
    var result = 0;
    for (let i=0; i<n; i++) {
        for (let k=0; k<n; k++) {
            var key = 0 - nums3[i] - nums4[k];
            if (map.has(key)) {
                result += map.get(key);
            }
        }
    }
    return result;
};

二、383 赎金信

这个在Day6已经写过了。详见http://t.csdn.cn/pYsYv

三、15 三数之和

  1. 题目链接:https://leetcode.cn/problems/3sum/

  1. 思路:自己想不出来,还是看卡哥的吧。去重我真的不会做!https://programmercarl.com/0015.%E4%B8%89%E6%95%B0%E4%B9%8B%E5%92%8C.html#%E5%8E%BB%E9%87%8D%E9%80%BB%E8%BE%91%E7%9A%84%E6%80%9D%E8%80%83

  1. 代码:

var threeSum = function(nums) {
    nums.sort((a,b) => a - b);
    var result = [];
    for (let i=0; i<nums.length-2; i++) {
        if (nums[i] > 0) {
            return result;
        }
        if (i && (nums[i] == nums[i-1])) {
            continue;
        }
        var left = i + 1;
        var right = nums.length - 1;
        while (left < right) {
            var sum = nums[i] + nums[left] + nums[right];
            if (sum > 0) {
                right--;
            }
            else if (sum < 0) {
                left++;
            }
            else {
                result.push([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--;
            }
        } 
    }
    return result;
};

下次来看的时候去记一下代码随想录的代码

四、18 四数之和

  1. 题目链接:https://leetcode.cn/problems/4sum/

  1. 思路:与三数之和一样,只不过是多套了一层循环

  1. 代码:

var fourSum = function(nums, target) {
    var result = [];
    nums.sort((a, b) => a - b);
    if (nums.length < 4) {
        return [];
    }
    for (let i=0; i<nums.length; i++) {
        if (i > 0 && nums[i] == nums[i - 1]) {
            continue;
        }
        for (let j=i+1; j<nums.length; j++) {
            if (j > i + 1 && nums[j] == nums[j - 1]) {
                continue;
            }
            var left = j + 1;
            var right = nums.length - 1;
            while (left < right) {
                var sum = nums[i] + nums[j] + nums[left] + nums[right];
                if (sum > target) {
                    right--;
                }
                else if (sum < target) {
                    left++;
                }
                else {
                    result.push([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 result;
};

今日学习时长:1.5h左右

总结:今天实在是太累了,三数之和和四数之和都没有想出来,也没从头到尾写一遍,看了视频,要再巩固一下,周末的时候再看。下次再刷需要注意15题和18题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值