首页 > 编程语言 >代码随想录算法训练营第六天|力扣454.四数相加II、力扣383.赎金信、力扣15.三数之和、力扣18.四数之和

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

时间:2023-08-04 17:13:16浏览次数:45  
标签:四数 nums int 随想录 力扣 right result && left

四数相加II(力扣454.)

  • 前两个数组的值直接遍历,并将和存入map中,key为和,value为出现次数
  • 后两个数组再次遍历,在map中寻找是否存在0-(c+d),若存在,count+=value
  • for(a:A){//遍历AB
  • for(b:B){
  • map[a+b]++;}}//insert操作
  • for(c:C){
  • for(d:D){
  • target = 0 - (c+d);
  • if(map.containsKey(target){
  • count += map.get(target);})}}
//先令前两个数组的和存在一个map中,key为值,value为得到次数;
//再次对后两个数组遍历,寻找是否有满足条件的值,count+=value;
//运用map.getOrDefault(num,0)表示返回value值或是默认值0
class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        int result = 0;
        Map<Integer,Integer> map = new HashMap<>();
        for(int a : nums1){
            for(int b : nums2){
                map.put(a+b,map.getOrDefault(a+b,0) + 1);//返回value值,若无,则返回默认值
            }
        }
        for(int c : nums3){
            for(int d : nums4){
                int target = 0 - (c + d);
                result += map.getOrDefault(target,0);
            }
        }
        return result;
    }
}

赎金信(力扣383.)

  • 索引确定用数组的哈希,toCharArray()将字符串转换为字符数组
class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        //特殊情况的边界条件一定要考虑
        if(ransomNote.length() > magazine.length()){
            return false;
        }
        int[] arr = new int[26];
        //toCharArray()将字符串转换为字符数组
        for(char a : magazine.toCharArray()){
            arr[a - 'a']++;
        }
        for(char b : ransomNote.toCharArray()){
            arr[b - 'a']--;
        }
        for(int count : arr){
            if(count < 0){
                return false;
            }
        }
        return true;
    }
}

三数之和(力扣15.)

  • 双指针法

  • 对数组进行排序

  • 从头开始遍历i

  • 如果nums[i]>0,return;//target结果为0,此为正则不可能

  • 和前一位比较,如果相同值则跳过且i>0//去重操作

  • left = i+1;right = nums.size - 1;

  • while(right > left){

  • //遍历

  • if( > 0) right--;

  • if( < 0) left++;

  • else{

  • result.push(nums[i],nums[left],nums[right])}

  • while(right>left&&right[i]==right[i-1])right--;

  • while(right>left&&left[i]==left[i+1])}

  • //在插入正确答案后,以上对b和c进行去重,其逻辑与对a去重相反

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();
        Arrays.sort(nums);
        for(int i = 0;i < nums.length;i++){
            if(nums[i] > 0){
                return result;
            }
            if(i>0&&nums[i]==nums[i-1]){//去除a
                continue;
                //i++;
            }
            int left = i+1;
            int right = nums.length - 1;
            while(right > left){
                if(nums[i] + nums[left] + nums[right] > 0){
                    right--;
                }else if(nums[i] + nums[left] + nums[right] < 0){
                    left++;
                }else{
                    result.add(Arrays.asList(nums[i],nums[left],nums[right]));
                //在result插入正确答案后,去重b和c
                while(right>left && nums[right] == nums[right - 1]){
                    right--;
                }
                while(right>left && nums[left] == nums[left + 1]){
                    left++;
                }
                left++;
                right--;
                }   
            }
        }
        return result;
    }
}

四数之和(力扣18.)

  • 在三数之和的基础上新加一个数,要注意对每个数字都要进行去重操作
  • 剪枝操作要慎重,考虑到每个数大于零的情况
class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        Arrays.sort(nums);
        List<List<Integer>> result = new ArrayList<>();
        if(nums.length < 4){
            return result;
        }
        for(int i = 0; i < nums.length;i++){
            //剪枝必须满足nums[i]和target都大于0
            if(nums[i]>0&&target>0&&nums[i]>target){
                return result;
            }
            //去除多余i
            if(i > 0 && nums[i] == nums[i - 1]){
                continue;
            }
            for(int j = i+1;j<nums.length;j++){
                // if(nums[i]>0&&nums[j]>0&&target>0&&nums[i]+nums[j]>target){
                //     return result;
                // }
                //去除多余j
                if(j>i+1&&nums[j] == nums[j - 1]){
                    continue;
                }
                int left = j + 1 ;
                int right = nums.length - 1;
                
                while(right > left){
                    //num的赋值应该在循环里,因为它的值随着left,right变化而变化
                long num = (long)nums[i] + nums[j] + nums[left] + nums[right];
                if(num > target){
                    right--;
                }else if(num < target){
                    left++;
                }else{
                    result.add(Arrays.asList(nums[i],nums[j],nums[left],nums[right]));
                    //去除b、c
                    while(right>left&&nums[right] == nums[right - 1]){
                        right--;
                    }
                    while(right>left&&nums[left] == nums[left + 1]){
                        left++;
                    }
                    right--;
                    left++;
                }
            }
            }
        }
        return result;
    }
}

标签:四数,nums,int,随想录,力扣,right,result,&&,left
From: https://www.cnblogs.com/zcctxr/p/17606487.html

相关文章

  • 代码随想录算法训练营第四十五天| 503.下一个更大元素II 42. 接雨水
    503.下一个更大元素II 要求:数组是环,需要找到下一个最大的元素思路1:先作为直线遍历,然后没有的节点,放到首部,再找比他大的节点注意:头节点代码:1//要求:返回循环数组中下一个更大的数字步数2//思路:先不循环遍历,3//然后对每个-1节点,以他为起始,放到数组的开头,计算有几......
  • 代码随想录算法训练营第九天| 复习字符串和双指针法(看卡哥文章复习)
     KMP算法就是在一个字符串中寻找另一个子串,避免了“跳回下一个字符再重新匹配”,实现了在一次字符串的遍历过程中就可以匹配出子串。28. 实现 strStr()  (本题可以跳过)     卡哥建议:因为KMP算法很难,大家别奢求 一次就把kmp全理解了,大家刚学KMP一定会有各种各样的......
  • [代码随想录]Day07-字符串 part01
    题目:344.反转字符串思路:每次把最前面和最后面的交换位置即可strings库里没有反转的方法——这个反转是之后几个题的一个基础代码:双指针调换位置funcreverseString(s[]byte){l,r:=0,len(s)-1//最前面的元素,最后面的元素forl<r{s[l],s[......
  • 代码随想录算法训练营第四十三天| 583. 两个字符串的删除操作 72. 编辑距离
    583.两个字符串的删除操作要求:删除最少的步数,来让这两个字符串相等思路:求末尾的最长公共子序列的长度,然后减去他们的长度代码:1//要求:两个字符串,删除任意一个字符后,让这两个字符相等2//dp[n][m]以n-1结尾的字符串变成节点为m-1为子序列的最大个数3//4//求......
  • 代码随想录算法训练营第四十一天| 1143.最长公共子序列 1035.不相交的线 53. 最大
    1143.最长公共子序列  要求:可以跳过,找出来最长符合的节点难点:如何跳过了之后仍然保留之前的值思路:如果不符,并不是dp[i-1][j-2]等于之前的值,而是dp[i][j]等于它的相关节点以上很重要代码:1//要求:两个子数组,可以删减跳过,找出最长的长度2//思路:dp[n][m]代表第......
  • 第 356 场周赛 - 力扣(LeetCode)
    第356场周赛-力扣(LeetCode)2798.满足目标工作时长的员工数目-力扣(LeetCode)一次遍历classSolution{public:intnumberOfEmployeesWhoMetTarget(vector<int>&hours,inttarget){intans=0;for(autoi:hours)ans+=......
  • 代码随想录算法训练营第五天|力扣242.有效的字母异位词、力扣242.两个数组的交集、力
    哈希表哈希表理论基础哈希表,又称为散列表(HashTable),是根据关键码的值而直接进行访问的数据结构其中,数组就是一张哈希表;表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素哈希表解决的问题:一般哈希表都是用来快速判断一个元素是否出现在集合中哈希函数:把学生的......
  • 代码随想录算法训练营第三天| LeetCode 242.有效的字母异位词 349. 两个数组的交集
    242.有效的字母异位词    卡哥建议: 这道题目,大家可以感受到数组用来做哈希表给我们带来的遍历之处。    题目链接/文章讲解/视频讲解: https://programmercarl.com/%E5%93%88%E5%B8%8C%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html   做题思路:......
  • 力扣-接雨水2
    1.问题描述给你一个mxn的矩阵,其中的值均为非负整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水。示例:给出如下3x6的高度图:[ [1,4,3,1,3,2], [3,2,1,3,2,4], [2,3,3,2,3,1]]返回4。如下图所示,这是下雨前的高度图[[1,4,3,1,3,2],[3......
  • [代码随想录]Day05-哈希表 part01
    题目:242.有效的字母异位词思路:很简单,就是看两个字符串每个字母出现的次数是不是相同的。可以用两个数组来比较,也可以用一个数组比较。代码:一个数组funcisAnagram(sstring,tstring)bool{isExist:=[26]int{}//26个字母for_,ch:=ranges{isE......