首页 > 编程语言 >代码随想录算法训练营第七天(LeetCode454.四数相加Ⅱ;LeetCode383.赎金信;LeetCode15.三数之和;LeetCode18.四数之和)

代码随想录算法训练营第七天(LeetCode454.四数相加Ⅱ;LeetCode383.赎金信;LeetCode15.三数之和;LeetCode18.四数之和)

时间:2024-11-18 19:16:50浏览次数:3  
标签:四数 nums int sum 随想录 LeetCode454 right 数组 left

LeetCode 454. 四数相加Ⅱ

题目链接:四数相加Ⅱ题目链接

思路

这道题目给定我们四个数组,让我们判断从四个数组中分别取一个元素,然后将这四个元素相加,值为 0 的元组个数,所以我们可以模仿两数之和,因为四个数组中分别取元素就是任意取,不需要考虑去重的问题,所以可以将四个数组转换成两个数组。然后使用两数之和的方法来做。

代码

class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        int res=0;
        //key存储的是两个数组元素的和,value存的是和出现的次数
        Map<Integer,Integer>map=new HashMap<Integer,Integer>();
        for(int i:nums1)
        for(int j:nums2)
        {
            int sum=i+j;
            map.put(sum,map.getOrDefault(sum,0)+1);
        }
        for(int i:nums3)
        for(int j:nums4)
        {
            res+=map.getOrDefault(0-i-j,0);
        }
        return res;
    }
}

LeetCode 383. 赎金信

题目链接:赎金信题目链接

思路

这道题目给定了两个字符串数组,一个数组是杂志数组,一个数组是赎金信数组。我们需要保证可以从杂志数组中获取所有赎金信数组中的字符,所以我们设置一个数组 record 用来记录,如果杂志数组中有相应的单词,则 record++, 如果赎金信数组中有相应的单词,则 record–。最终,如果 record 数组中的值全部大于 0,则说明可以从杂志数组中获取所有赎金信数组中的字符,否则则不能。

代码

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        if(ransomNote.length()>magazine.length())
            return false;
        int[] record=new int[26];
        for(char c:magazine.toCharArray())
        {
            record[c-'a']++;
        }
        for(char c:ransomNote.toCharArray())
        {
            record[c-'a']--;
        }
        for(int i=0;i<26;i++)
        {
            if(record[i]<0)
                return false;
        }
        return true;
    }
}

LeetCode15.三数之和

题目链接:三数之和题目链接

思路

这道题目要求我们在一个数组中获取三个元素,它们的和为 0,并且三个元素组成的元组结果值是不能重复的。这道题目主要的关键点是去重,我们使用双指针的做法,首先使用 i 遍历这个数组元素,i 执行去重操作就是使用 nums[i]==nums[i-1] 进行判断,因为我们后续的 left 指针为 left=i+1, 所以我们是无法使用 nums[i]==nums[i+1] 来进行判断的。然后设置 left 指针为 left=i+1,设置 right 指针为 right=nums.length-1, 然后判断三个指针指向的元素和是否为 0,因为我们之前首先要对数组进行排序操作,所以如果和大于 0,则我们将 right 值减 1,如果和小于 0,我们将 left 值加 1,后续又要考虑 left 和 right 值的去重操作,left 值的去重操作是使用 nums[left]==nums[left+1],right 值的去重操作是使用 nums[right]==nums[right-1]。因为结果不能重复,所以判断出一个值后,需要 left 和 right 分别指向加减操作。

代码

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]) //去重
                continue;
            int left=i+1;
            int right=nums.length-1;
            while(right>left)
            {
                int sum=nums[i]+nums[left]+nums[right];
                if(sum>0)
                    right--;
                else if(sum<0)
                    left++;
                else
                {
                    result.add(Arrays.asList(nums[i],nums[left],nums[right]));
                    while(right>left&&nums[right]==nums[right-1]) right--;
                    while(right>left&&nums[left]==nums[left+1]) left++;
                    right--;
                    left++;
                }
            }
        }
        return result;
    }
}

LeetCode 9. 四数之和

题目链接:四数之和题目链接

思路

跟三数之和的思路是相同的,区别在于去重和剪枝的变化。

代码

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        Arrays.sort(nums);
        List<List<Integer>> result= new ArrayList<>();
        for(int k=0;k<nums.length;k++)
        {
            if(nums[k]>target&&nums[k]>=0)
                return result;
            if(k>0&&nums[k]==nums[k-1])
                continue;
            for(int i=k+1;i<nums.length;i++)
            {
                if(nums[k]+nums[i]>target&&nums[k]+nums[i]>=0)
                    break;
                if(i>k+1&&nums[i]==nums[i-1])
                    continue;
                int left=i+1;
                int right=nums.length-1;
                while(right>left)
                {
                    long sum=(long) nums[k]+nums[i]+nums[left]+nums[right];
                    if(sum>target)
                        right--;
                    else if(sum<target)
                        left++;
                    else
                    {
                        result.add(Arrays.asList(nums[k],nums[i],nums[left],nums[right]));
                        while(right>left&&nums[right]==nums[right-1]) right--;
                        while(right>left&&nums[left]==nums[left+1]) left++;
                        left++;
                        right--;
                    }
                }
            }
            
        }
        return result;
    }
}

标签:四数,nums,int,sum,随想录,LeetCode454,right,数组,left
From: https://blog.csdn.net/qq_51597940/article/details/143776840

相关文章

  • 代码随想录算法训练营第八天(LeetCode344.反转字符串;LeetCode541.反转字符串Ⅱ;卡码网54
    LeetCode344.反转字符串题目链接:反转字符串题目链接思路这道题目让我们进行字符串的反转,其实直接使用reverse相关的函数就可以解决问题。但是解决问题的时候,如果这道题目使用库函数就可以直接解决,就最好不要使用库函数;如果库函数只是题目中解法的一小步,那么就使用......
  • 代码随想录算法训练营第六天|哈希表|LC242. 有效的字母异位词|LC349. 两个数组的交集|
    哈希表    哈希表:用来快速判断一个元素是否出现在集合里;O(1);    哈希碰撞:比如小王和小李都映射到索引下表1的位置,有2中解决办法(拉链法和线性探测法);    拉链发:通过索引找到,其实拉链发就是要选择适当的哈希表的大小,这样既不会因为数组空值而浪费大量内......
  • 代码随想录算法训练营第四天|LC24.两两交换链表中的节点|LC19. 删除链表的倒数第 N 个
    24.两两交换链表中的节点-力扣(LeetCode)    1、需要一个虚拟节点进行帮助;    2、注意虚拟节点的连接以及变化(尝试有点困惑它的变化,后面有点理解);    3、注意后续第二组的交换时如何与第一组交换进行连接;fromtypingimportOptionalclassLis......
  • 代码随想录算法训练营第三十二天| 509. 斐波那契数 、70. 爬楼梯、746. 使用最小花费
    理论基础总结一下就是:动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的。动态规划五部曲确定dp数组(dptable)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组509.斐波那契数1.......
  • 代码随想录算法训练营第三十三天| 62.不同路径 、63. 不同路径 II、343. 整数拆分 。c
    62.不同路径思路:按照dp五步法分析,成功AC。代码随想录classSolution{publicintuniquePaths(intm,intn){int[][]dp=newint[m+1][n+1];dp[0][1]=1;for(inti=1;i<=m;i++){for(intj=1;j<=n;j++){......
  • 代码随想录:螺旋矩阵 II
    代码随想录:螺旋矩阵II题目是不难的,本质是重复多次顺时针旋转,注意边界条件。我第一次写错是二维数组的运用出了问题,vec[i][j]中,i代表行,j代表列,我的脑袋是明白的,但是在运用时,一开始二维矩阵向右遍历时,其实变的是j而非i另外注意一下二维vector的建立就行//二维vector数组本质上......
  • 代码随想录:长度最小的子数组
    代码随想录:长度最小的子数组现在不像考研那时候,每天时间都是固定的,以后可能还是以周为单位定目标比较好一点滑动窗口问题,之后记得和计算机网络里的滑动窗口对比,并且和背包问题对比classSolution{public:intminSubArrayLen(inttarget,vector<int>&nums){i......
  • 代码随想录:开发商购买土地
    代码随想录:开发商购买土地纯铸币题目浪费时间,两个include记一下#include<climits>//INT_MAX#include<cmath>//min#include<iostream>#include<vector>#include<climits>#include<cmath>usingnamespacestd;intmain(){inta,b;cin>......
  • 数据结构与算法刷题(参考代码随想录结构,C、C++实现)
    目录数组数组理论基础二分查找移除元素有序数组的平方长度最小的子数组螺旋矩阵Ⅱ总结篇链表1.链表理论基础2.移除链表元素3.设计链表4.反转链表5.两两交换链表中的节点6.删除链表的倒数第N个节点7.链表相交8.环形链表Ⅱ9.总结篇哈希表1.哈希表理论基础2.有效的字母异位词3.两个数......
  • 代码随想录算法训练营第四十七天|Day47 单调栈
    739.每日温度https://programmercarl.com/0739.%E6%AF%8F%E6%97%A5%E6%B8%A9%E5%BA%A6.html思路int*dailyTemperatures(int*temperatures,inttemperaturesSize,int*returnSize){int*answer=(int*)malloc(temperaturesSize*sizeof(int));int*sta......