第三章 哈希表part02(● 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和 )

学习目标:

● 454.四数相加II
● 383. 赎金信
● 15. 三数之和
● 18. 四数之和
● 总结


学习内容:

● 454.四数相加II
tip:使用map,先把前两个数组遍历相加,map存相加和 和 出现的次数。遍历后两个数据相加和,0-相加和。判断是否在map里,取value相加
题目链接/文章讲解/视频讲解:https://programmercarl.com/0454.%E5%9B%9B%E6%95%B0%E7%9B%B8%E5%8A%A0II.html

需要在熟悉一下map的API
var fourSumCount = function(nums1, nums2, nums3, nums4) {
    let resMap = new Map()
    let count = 0;
    for(let i = 0;i<nums1.length;i++){
        for(let j=0;j<nums2.length;j++){
            let x = nums1[i]+nums2[j]
            resMap.set(x,(resMap.get(x)||0)+1)
        }
    }
    for(let i = 0; i<nums3.length;i++){
        for(let j=0;j<nums4.length;j++){
            let y = 0-nums3[i]-nums4[j]
            if(resMap.has(y)){
                count+=resMap.get(y)
            }
        }
    }
    return count
};

学习内容:

● 383. 赎金信

题目链接/文章讲解:https://programmercarl.com/0383.%E8%B5%8E%E9%87%91%E4%BF%A1.html

//练习题,思路类似242.有效的字母异位词
var canConstruct = function(ransomNote, magazine) {
    let arr = new Array(26).fill(0)
    let temp = "a".charCodeAt();
    for(const i of magazine){
        arr[i.charCodeAt()-temp]++
    }
    for(const j of ransomNote){
        if(!arr[j.charCodeAt()-temp]) return false
        arr[j.charCodeAt()-temp]--
    }
    return true
};

学习内容:

● 15. 三数之和
tip:双指针。去重
题目链接/文章讲解/视频讲解:https://programmercarl.com/0015.%E4%B8%89%E6%95%B0%E4%B9%8B%E5%92%8C.html

 let arr = nums.sort((a, b) => a - b)//升序排序
 //判断arr[i]>0时,是return result  第一次直接写成return???
 //for循环里的continue是结束本次循环,继续下次循环
 //对于nums[left]和nums[right]去重,使用while。写成了if
var threeSum = function(nums) {
  let result = []
  let arr = nums.sort((a, b) => a - b)
  for(let i = 0; i<arr.length; i++){
      if(arr[i]>0) return result
      if(i>0 && arr[i]==arr[i-1]) continue
      let left = i+1;
      let right = arr.length-1;
      while(left<right){
          if(arr[i]+arr[left]+arr[right]>0){
              right--
          }else if(arr[i]+arr[left]+arr[right]<0){
              left++
          }else{
              result.push([arr[i],arr[left],arr[right]])
              while(left<right &&arr[left] == arr[left+1]){
                  left++;
              }
              while(left<right && arr[right]==arr[right-1]){
                  right--;
              }
              left++;
              right--;
          }
      }
  }
  return result
};

学习内容:

● 18. 四数之和
题目链接/文章讲解/视频讲解:https://programmercarl.com/0018.%E5%9B%9B%E6%95%B0%E4%B9%8B%E5%92%8C.html

重点在去重和剪枝
var fourSum = function(nums, target) {
    nums.sort((a,b)=>a-b)
    let result = []
    if(nums.length<4) return []
    for(let i = 0;i<nums.length-3;i++){
        if(nums[i]+nums[i+1]+nums[i+2]+nums[3]>target) return result
        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){
                if(nums[i]+nums[j]+nums[left]+nums[right] ==target){
             
                    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++
                }else if(nums[i]+nums[j]+nums[left]+nums[right]<target){
                    left++
                }else{
                     right--
                }
            }
        }
    }
    return result
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值