代码随想录算法训练营第七天 | 第454题.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和

454.四数相加II

题目链接: 454.四数相加II
参考文档:代码随想录
状态:已完成,耗时40min
思路:除了暴力解法没有思路,看完答案发现最优解也需要O(n^2)时间复杂度,其中写完之后发现有问题,最后发现是有一个for循环漏了大括号。。代码如下:

var fourSumCount = function(nums1, nums2, nums3, nums4) {
    let temp = new Map();
    let result = 0;
    let count = 0;
    for(let i = 0;i<nums1.length;i++){
        for(let j = 0;j<nums2.length;j++){
            count = temp.get(-nums1[i]-nums2[j]);
            if(count===undefined){
                temp.set(-nums1[i]-nums2[j], 1);
            }
            else{
                temp.set(-nums1[i]-nums2[j], count+1);
            }
        }
    }
    for(let k = 0;k<nums3.length;k++){
        for(let l = 0;l<nums4.length;l++){
            if(temp.get(nums3[k]+nums4[l])){
                result+=temp.get(nums3[k]+nums4[l]);
            }
        }
    }
    return result;
};

383. 赎金信

题目链接: 383. 赎金信
参考文档:代码随想录
状态:已完成,耗时40min
思路:比较简单,和字母异位词比较类似

var canConstruct = function(ransomNote, magazine) {
    let gather = new Map();
    magazine = magazine.split("");
    ransomNote = ransomNote.split("");
    for(const letter of magazine){
        let count = gather.get(letter);
        gather.set(letter,(count||0)+1);
    }
    for(const letter of ransomNote){
        let count = gather.get(letter);
        if(count==undefined) return false;
        gather.set(letter,count-1);  //count--是什么时候才会生效?
        if(gather.get(letter)<0) return false;
    }
    return true;
};

第15题. 三数之和

题目链接: 第15题. 三数之和
参考文档:代码随想录
状态:已完成,耗时两小时
思路:没有思路,看了答案决定用双指针,后面在去重上一直吃瘪,感觉还是有技巧的。

第15题. 三数之和

题目链接: 第15题. 三数之和
参考文档:代码随想录
状态:已完成,耗时两小时
思路:没有思路,看了答案决定用双指针,后面在去重上一直吃瘪,感觉还是有技巧的。

var threeSum = function(nums) {
    let ret = [];
    nums = nums.sort((a,b)=>(a-b));
    for(let i = 0;i<nums.length-2;i++){
        if(nums[i]>0) return ret;
        let left = i+1;
        let right = nums.length-1;
        if(nums[i]==nums[i-1] && i>0) continue;
        while(left<right){
            if(nums[i]+nums[left]+nums[right]===0){
                ret.push([nums[i],nums[left],nums[right]]);
                while(nums[left]===nums[left+1]) left++;
                while(nums[right]===nums[right-1]) right--;
            }
            nums[i]+nums[left]+nums[right]>0?right--:left++;
        }
    }
    return ret;
};

第18题. 四数之和

题目链接: 第18题. 四数之和
参考文档:代码随想录
状态:已完成,耗时一小时
思路:和三数之和一个思路,因为把箭头函数的用法搞错了导致花了很长时间

var fourSum = function(nums, target) {
    let ret = [];
    nums = nums.sort((a,b) => 
        a-b
    );
    for(let i =0;i<nums.length-3;i++){
        if(nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target) break;
        if(i>0 && nums[i]==nums[i-1]) continue;
        for(let j = i+1;j<nums.length-2;j++){
            if(j>i+1 && nums[j]==nums[j-1]) continue;
            let left=j+1;
            let right=nums.length-1;
            while(left<right){
                let sum = nums[i]+nums[j]+nums[left]+nums[right];
                if(sum===target){
                    ret.push([nums[i],nums[j],nums[left],nums[right]]);
                    while(left < right && nums[left]===nums[left+1]){
                        left++;
                    } 
                    left++;
                    while(left < right && nums[right]===nums[right-1]){
                        right--;
                    }
                    right--;
                }else if(sum<target){
                    left++;
                }else right--;
            }
        }
    }
    return ret;
};
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值