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

454. 4Sum II

  • 思路
    • 遍历nums1,nums2,求和放进map
      • key为和
      • value为和出现次数
    • 遍历nums3, nums4, 求target
    • 在map里找target,如果有则累加其value值
    • TC N2
    • java
      
      class Solution {
          public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
              
              Map map = new HashMap<>();
              int count = 0;
              for(int i : nums1){
                  for(int j : nums2){
                      int temp = i + j;
                      map.put(temp, map.getOrDefault(temp, 0) + 1);
                  }
              }
              
              for(int i: nums3){
                  for(int j : nums4){
                      int target = 0 - (i + j);
                      if(map.containsKey(target)){
                          count += map.get(target);
                      }
                  }
              }
              
              return count;
          }
      }

 383. Ransom Note

  • 思路
    • 挺简单的直接上码了
    • java
      class Solution {
          public boolean canConstruct(String ransomNote, String magazine) {
              Map map = new HashMap<>();
              
              for(char c: magazine.toCharArray()){
                  map.put(c, map.getOrDefault(c, 0) +1);
              }
              
              for(char c: ransomNote.toCharArray()){
                 if (!map.containsKey(c)){
                     return false;
                 }
                  map.put(c, map.get(c) - 1);
                  if (map.get(c) < 0){
                      return false;
                  }
              }
              return true;
          }
      }

15. 3Sum

  • 思路:
    • 三指针
    • java
      //直接用条件去重比较复杂,还是用个set比较方便
      
      class Solution {
          public List> threeSum(int[] nums) {
              List> res = new ArrayList<>();
              Arrays.sort(nums);
              if (nums[0] > 0) {
                  return res;
              }       
              for(int i = 0 ; i < nums.length; i++){
                  if(i >0 && nums[i] == nums[i - 1]){
                      continue;
                  }
                  int l = i + 1;
                  int r = nums.length - 1;
                  while (l < r){
                          int sum = nums[i] + nums[l] + nums[r];
                      if( sum > 0){
                          r --;
                      }else if( sum < 0){
                          l ++;
                      }else{
                          res.add(Arrays.asList(nums[i], nums[l], nums[r]));
                          
                          while(l < r && nums[r - 1] == nums[r]){ //去重
                              r--;
                          }
                          while(l < r && nums[l] == nums[l +1]){ // 去重
                              l++;
                          }
                          l++;
                          r--;
                      }        
                  }         
              }
              return res;
          }
      }
      
      //set 去重法
      class Solution {
          public List> threeSum(int[] nums) {
              Set> set = new HashSet<>();
              Arrays.sort(nums);
              if (nums[0] > 0) {
                  return res;
              } 
              
              
              for(int i = 0 ; i < nums.length; i++){
                  if(i >0 && nums[i] == nums[i - 1]){
                      continue;
                  }
                  int l = i + 1;
                  int r = nums.length - 1;
                  while (l < r){
                          int sum = nums[i] + nums[l] + nums[r];
                      if( sum > 0){
                          r --;
                      }else if( sum < 0){
                          l ++;
                      }else{
                          set.add(Arrays.asList(nums[i], nums[l], nums[r]));
                          l++;
                          r--;
                      }        
                  }          
              }
              return new ArrayList(set);
          }
      }
      
      
      
      
      
      

 18. 4Sum

  • 思路
    • 类似3Sum
    • java
      class Solution {
          public List> fourSum(int[] nums, int target) {
              List> res = new ArrayList<>();
              Arrays.sort(nums);
              if(nums[0] > 0 && nums[0] > target ){
                  return res;
              }
              for(int i = 0; i< nums.length; i++){
                  if(i >0 && nums[i] == nums[i-1]){
                      continue;
                  }
                  for(int j = i + 1; j < nums.length; j++){
                      if( j > i + 1 && nums[j] == nums[j - 1]){
                          continue;
                      }
                      int l = j + 1;
                      int r = nums.length - 1;
                      while( l < r){
                          int sum = nums[i] + nums[j] + nums[l] + nums[r];
                          if( sum > target){
                              r--;
                          }else if (sum < target){
                              l++;
                          }else{
                              res.add(Arrays.asList(nums[i],nums[j],nums[l],nums[r]));
                              
                              while(l < r && nums[r] == nums[r-1]){
                                  r--;
                              }
                              while(l < r && nums[l] == nums[l+1]){
                                  l++;
                              }
                              r--;
                              l++;
                          }
                      }
                      
                  }
              }
              return res;
          }
      }
    • Set去重
    • java
      
      class Solution {
          public List> fourSum(int[] nums, int target) {
              List> res = new ArrayList<>();
              Set> set = new HashSet<>();
              
              Arrays.sort(nums);
              if(nums[0] > 0 && nums[0] > target ){
                  return res;
              }
              for(int i = 0; i< nums.length; i++){
                  // if(i >0 && nums[i] == nums[i-1]){    //剪枝去了速度会慢很多
                  //     continue;
                  // }
                  for(int j = i + 1; j < nums.length; j++){
                      // if( j > i + 1 && nums[j] == nums[j - 1]){
                      //     continue;               //剪枝去了速度会慢很多
                      // }
                      int l = j + 1;
                      int r = nums.length - 1;
                      while( l < r){
                          int sum = nums[i] + nums[j] + nums[l] + nums[r];
                          if( sum > target){
                              r--;
                          }else if (sum < target){
                              l++;
                          }else{
                              set.add(Arrays.asList(nums[i],nums[j],nums[l],nums[r]));
                              l++;
                              r--;
                          }
                      }
                      
                  }
              }
              return new ArrayList(set);
          }
      }
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值