首页 > 编程语言 >代码随想录算法训练营,9月3日 | 454.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和

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

时间:2024-09-03 21:37:26浏览次数:5  
标签:四数 15 nums int 随想录 ++ right && left

454.四数相加II
题目链接:454.四数相加II
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰四数相加II
日期:2024-09-03

想法:4个数组,两两分开遍历时间复杂度低点,用一个map,key是i+j的值,value是出现次数,对nums3、4只需要判断0 - k - l在不在map里,最后依次加上出现次数就行了。
Java代码如下:

class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        int count = 0;
        for(int i : nums1){
            for(int j :nums2){
                int sum = i + j;
                map.put(sum, map.getOrDefault(sum, 0) + 1);
            }
        }
        for(int k : nums3){
            for(int l : nums4){
                count += map.getOrDefault((0 - k - l), 0);
            }
        }
        return count;
    }
}

总结:map.getOrDefault(sum, 0):如果 map 中存在键 sum,则返回该键对应的值;如果不存在,则返回默认值0。

383. 赎金信
题目链接:383. 赎金信
文档讲解︰代码随想录(programmercarl.com)
日期:2024-09-03

想法:比较简单的一题,看到小写字母想到用数组做哈希,接下来就是先遍历magazine做加法,再ransomNote做减法。
Java代码如下:

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

总结: for (char i : magazine.toCharArray())注意这个遍历的方法。

15. 三数之和
题目链接:15. 三数之和
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰三数之和
日期:2024-09-03

想法:1.哈希:两层for循环确定a和b值,再确定 0-a-b是否出现,但去重操作很麻烦;2.双指针:其实感觉是三指针,i为起始点,left = i + 1,right = nums.length - 1,通过判断三个的和与0的大小来压缩空间,这还需要数组本身是有序的,找到和为0的三元组
Java代码如下:

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){
                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]));
                    while (right > left && nums[right] == nums[right - 1]) right--;
                    while (right > left && nums[left] == nums[left + 1]) left++;
                    right--;
                    left++;
                }
            }
        }
        return result;
    }
}

总结:这道题中去重是需要头脑很清晰的,从i > 0 && nums[i] == nums[i - 1],到while (right > left && nums[right] == nums[right - 1]) right--,while (right > left && nums[left] == nums[left + 1]) left++;的位置和方式是right - 1还是right + 1一定要想清楚。

18. 四数之和
题目链接:18. 四数之和
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰四数之和
日期:2024-09-03

想法:思路跟三数之和差不多了,nums[i]的值固定变成nums[k] + nums[i]的固定
Java代码如下:

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 (k > 0 && nums[k] == nums[k - 1]) {
                continue;
            }
            for (int i = k + 1; i < nums.length; i++) {
                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++;
                        right--;
                        left++;
                    }
                }
            }
        }
        return result;
    }
}

总结:可以进行些剪枝操作,5数之和到n数之和都可以这个方法,用双指针降低一个复杂度。

if (nums[k] > target && nums[k] >= 0) {
    break;
}
if (nums[k] + nums[i] > target && nums[k] + nums[i] >= 0) {
    break;
}

标签:四数,15,nums,int,随想录,++,right,&&,left
From: https://www.cnblogs.com/wowoioo/p/18395503

相关文章

  • 代码随想录算法训练营第32天|509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
    目录509.斐波那契数1、题目描述2、思路3、code4、复杂度分析70.爬楼梯1、题目描述2、思路3、code746.使用最小花费爬楼梯1、题目描述2、思路3、code4、复杂度分析509.斐波那契数题目链接:link1、题目描述斐波那契数(通常用F(n)表示)形成的序列称为斐波那......
  • 【读书笔记-《30天自制操作系统》-14】Day15
    本篇内容开始讲解多任务。本篇内容结构很简单,先讲解任务切换的原理,再讲解任务切换的代码实践。但是涉及到的知识不少,理解上也有些难度。1.任务切换与多任务原理1.1多任务与任务切换所谓多任务,指的是操作系统同时运行多个任务。但是这种说法实际上是不准确的。如果只有......
  • 车载测试协议:ISO-14229、ISO-15765、ISO-11898、ISO-26262【车企实操项目学习】
      FOTA模块中OTA的知识点:1.测试过程中发现哪几类问题?   可能就是一个单键的ecu,比如升了一个门的ecu,他的升了之后就关不上,还有就是升级组合ecu的时候,c屏上不显示进度条。2.在做ota测试的过程中,会做网络通信的测试吗?   网络通信测试的话,有做,但是目前我的......
  • 【北京迅为】《stm32mp157开发板嵌入式linux开发指南》第五章 Ubuntu使用apt-get下载
         iTOP-STM32MP157开发板是基于意法半导体STARM双Cortex-A7核加单Cortex-M4核的一款多核异构处理器。Cortex-A7内核提供对开源操作系统Linux的支持,借助Linux系统庞大而丰富的软件组件处理复杂应用。M4内核上运行对于实时性要求严格的应用。         开......
  • 20240903_162154 mysql 填空题 分组与聚合
    查询tb表所有数据,结果按age升序排select*fromtborderbyageasc查询tb表所有数据,结果按score降序排序select*fromtborderbyscoredesc查询tb表所有数据,结果按age升序排,如果age相同的数据,按score降序排select*fromtborderbyageasc,scoredesc查询sanguo表,......
  • 7-15 房贷计算器
    7-15房贷计算器分数10全屏浏览切换布局作者 wdd单位 山东科技大学设计一款房贷计算器,按用户选择的贷款类型(商业贷款、公积金贷款、组合贷款)、贷款金额(万)、期限(年)、利率(%)可计算得出每月月供参考(元)、支付利息(元)、还款总额(元)这些信息。房贷计算公式:支付利息=还款总......
  • 代码随想录训练营完结总结
    在参加代码随想录的很久之前,我就听闻了卡哥的大名,也在B站上看到了相关的视频,但由于自制力一直不行,所有总是坚持不下去,当时好像就只看到了数组,甚至于链表都没开始看,就已经放弃了。想着这个暑假不能荒废了,就狠下心报名了训练营。并在这个暑假完成了代码随想录的一刷,自我感觉对于算法......
  • 代码随想录day49 || 42、接雨水 84、柱状图中最大的矩形
    42、接雨水functrap(height[]int)int{ //双指针思路,按照列计算雨水高度,分别计算每一列左右高于当前高度的最高柱子高度,然后通过min(left,right)-height[i]得出当前列的雨水体积 varresint varleft,rightint fori:=1;i<len(height)-1;i++{ left,right=......
  • 「代码随想录算法训练营」第五十二天 | 图论 part10
    目录Floyd算法题目:97.小明逛公园A*算法题目:126.骑士的攻击最短路算法总结Floyd算法Floyd算法用于求解多源最短路问题(求多个起点到多个终点的多条最短路径)。在前面学习的dijkstra算法、Bellman算法都是求解单源最短路的问题(即只能有一个起点)。注意:Floyd算法对边的权值正负没......
  • 代码随想录算法训练营|Day01 LeetCode 704.二分查找,27.移除元素,977.有序数组的平方
    数组理论基础数组是存放在连续空间上的相同类型数据的集合数组的元素是不能删的,只能覆盖704.二分查找LeetCode:704.有序数组的平方classSolution{public:intsearch(vector<int>&nums,inttarget){intlength=nums.size();inti=0......