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

news2024/12/23 5:23:59

目录

一、(leetode 454)四数相加II

二、(leetcode 383)赎金信

暴力解法

哈希法 

三、(leetcode 15)三数之和

四、(leetcode 18)四数之和


一、(leetode 454)四数相加II

力扣题目链接

状态:已AC。搞懂了key、value的意义了

class Solution {
public:
    int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
       unordered_map<int, int> umap; //key:a+b的数值,value:a+b数值出现的次数
        for (int a :nums1) {
            for (int b : nums2) {
                umap[a + b]++;
            }
        }
        int count = 0; // 统计a+b+c+d = 0 出现的次数
        // 在遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就把map中key对应的value也就是出现次数统计出来。
        for (int c : nums3) {
            for (int d : nums4) {
                if (umap.find(0 - (c + d)) != umap.end()) {
                    count += umap[0 - (c + d)];
                }
            }
        }
        return count;
    }
};

二、(leetcode 383)赎金信

力扣题目链接

状态:哈希法AC(类似242.有效的字母异位词),暴力法不熟悉erase用法,只了解了思路

暴力解法

class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        for (int i = 0; i < magazine.length(); i++) {
            for (int j = 0; j < ransomNote.length(); j++) {
                // 在ransomNote中找到和magazine相同的字符
                if (magazine[i] == ransomNote[j]) {
                    ransomNote.erase(ransomNote.begin() + j); // ransomNote删除这个字符
                    break;
                }
            }
        }
        // 如果ransomNote为空,则说明magazine的字符可以组成ransomNote
        if (ransomNote.length() == 0) {
            return true;
        }
        return false;
    }
};
iterator erase (iterator p);

其中,参数iterator是迭代器,即删除迭代器p指向的字符。返回值为删除后的字符串。

哈希法 

class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        int record[26] = {0};
        //add
        if (ransomNote.size() > magazine.size()) {
            return false;
        }
        for (int i = 0; i < magazine.length(); i++) {
            // 通过record数据记录 magazine里各个字符出现次数
            record[magazine[i]-'a'] ++;
        }
        for (int j = 0; j < ransomNote.length(); j++) {
            // 遍历ransomNote,在record里对应的字符个数做--操作
            record[ransomNote[j]-'a']--;
            // 如果小于零说明ransomNote里出现的字符,magazine没有
            if(record[ransomNote[j]-'a'] < 0) {
                return false;
            }
        }
        return true;
    }
};

三、(leetcode 15)三数之和

力扣题目链接

状态:思路清楚,代码错误过多,照着正确版本修改后AC,注意去重的逻辑,i-1、i和i+1

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> result;
        sort(nums.begin(), nums.end());
        // a = nums[i], b = nums[left], c = nums[right]
        for (int i = 0; i < nums.size(); i++) {
            // 排序之后如果第一个元素已经大于零,那么无论如何组合都不可能凑成三元组,直接返回结果就可以了
            if (nums[i] > 0) {
                return result;
            }
            if (i > 0 && nums[i] == nums[i - 1]) {
                continue;
            }
            int left = i + 1;
            int right = nums.size() - 1;
            while (right > left) {
                /*去重复逻辑如果放在这里,0,0,0 的情况,可能直接导致 right<=left 了,从而漏掉了 0,0,0 这种三元组
                /*
                while (right > left && nums[right] == nums[right - 1]) right--;
                while (right > left && nums[left] == nums[left + 1]) left++;
                */
                while (right > left && nums[right] == nums[right - 1]) right--;
                while (right > left && nums[left] == nums[left + 1]) left++;
                */
                if (nums[i] + nums[left] + nums[right] > 0) right--;
                else if (nums[i] + nums[left] + nums[right] < 0) left++;
                else {
                    result.push_back(vector<int>{nums[i], 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;
    }
};

四、(leetcode 18)四数之和

力扣题目链接

状态:已AC,不过剪枝处理是什么,还需要查+回顾

细节:

不要判断nums[k]>target 就返回了,三数之和 可以通过nums[i]>0就返回了,因为 0 已经是确定的数了,四数之和这道题目 target是任意值。比如:数组是[-4,-3,-2,-1]target-10,不能因为-4 > -10而跳过

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> result;
        sort(nums.begin(), nums.end());
        for (int k = 0; k < nums.size(); k++) {
            // 剪枝处理
            if (nums[k] > target && nums[k] >= 0) {
            	break;
            }
            if (k > 0 && nums[k] == nums[k - 1]) {
                continue;
            }
            for (int i = k + 1; i < nums.size(); i++) {
                // 2级剪枝处理
                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.size() - 1;
                while (right > left) {
                    // nums[k] + nums[i] + nums[left] + nums[right] > target 会溢出
                    if ((long) nums[k] + nums[i] + nums[left] + nums[right] > target) {
                        right--;
                    // nums[k] + nums[i] + nums[left] + nums[right] < target 会溢出
                    } else if ((long) nums[k] + nums[i] + nums[left] + nums[right]  < target) {
                        left++;
                    } else {
                        result.push_back(vector<int>{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;
    }
};

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1043793.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git 分支管理进阶

1. merge 命令&#xff1a;git merge A 作用&#xff1a;把 A 分支 合并到当前分支 &#xff08;此时当前分支新增了一次提交&#xff0c;指着指向该提交&#xff09; 初始状态&#xff1a; git merge bugFix 后&#xff1a; 此外&#xff0c;如果再把 main 分支合并到 bug…

Unigram,Bigram,N-gram介绍

Unigram,Bigram&#xff0c;N-gram介绍 Unigram,Bigram&#xff0c;N-gram这三个概念&#xff0c;在学习自然语言的过程中大家可能会遇到。 Unigram,Bigram&#xff0c;N-gram在自然语言内容中的语言模型部分中大家可能会碰到。语言模型有很多种&#xff0c;在上一篇介绍一个…

三层交换机与防火墙对接上网如何配置

环境: 1.三层交换机 H3C S6520 version 7.1.070, Release 6530P02 2.防火墙 深信服 8.0.75 AF-2000-FH2130B-SC 问题描述: 三层交换机与防火墙对接上网如何配置 公司有多个部门且位于不同网段,各部门均有访问Internet的需求。现要求用户通过三层交换机和防火墙访问…

MySQL 事务的操作指南(事务篇 二)

基本操作 事务的提交方式&#xff1a;自动提交&#xff08;autocommit1&#xff09;和手动提交&#xff08;autocommit0&#xff09; 查询和修改事务提交方式&#xff1a; -- 查看事务提交方式(标识表示这是个系统变量) select autocommit ;-- 修改事务提交方式为自动提交 …

Zorin OS 16.3 发布:无缝升级和卓越改进

导读Zorin OS 团队自豪地宣布了备受期待的 Zorin OS 16.3 版本的发布&#xff0c;这是这个受欢迎的 Linux 发行版的一个里程碑版本。自首次发布以来不到两年时间&#xff0c;Zorin OS 已经获得了庞大的用户群体&#xff0c;截至目前已经有 530 万次下载&#xff0c;而 16.3 版本…

网工内推 | 网络工程师,熟悉H3C设备,有华三认证优先

01 苏州市蓝皓计算机科技有限公司 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、网络架构方案的规划、设计&#xff1b; 2、网络设备的配置以及网络环境的管理、配置、排错、维护&#xff1b; 3、网络项目的实施、协调、管理&#xff1b; 4、完成部门主管要求的各…

N 皇后问题

N 皇后问题研究的是如何将 N 个皇后放置在 N x N 的棋牌上&#xff0c;并且使皇后彼此之间不能相互攻击。 国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子 解决思路是&#xff1a;剪枝 回溯方法 解决问题 (1).使用二维数组创建棋牌格子 g…

Spring MVC 和 Spring Boot 的区别

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

连接组学中的机器学习:从表征学习到模型拟合

前言 机器学习(ML)由于其高自动化程度、高灵敏度和特异性优势&#xff0c;在医学影像领域取得了巨大的成功。由于具备这些优势&#xff0c;机器学习已被广泛应用于神经成像数据&#xff0c;目的是提取与感兴趣变量(如疾病状态)相关的特征。这使我们能够形成关于不同条件下大脑…

Python之xToolkit库

文章目录 一、xToolkit是什么&#xff1f;二、准备工作1.引入库2.导入数据 三、使用时间模块-xdatetime判断时间格式是否正确get方法获取时间戳获取年月日时分秒时间推移计算时间替换时间扩展两个时间的差值开始与结束时间时间是否在指定区间中 字符串模块-xstring字符串格式校…

前端任意修改地图风格颜色

在做地图相关应用时&#xff0c;常常遇到地图风格与UI界面不搭配的问题&#xff0c;如果在制图时就制作多种风格的地图&#xff0c;耗时耗力&#xff0c;超出成本控制。这里推荐一种快捷的方法&#xff0c;可在前端快速更改地图成任意风格&#xff0c;使色调与UI搭配。 先上一张…

软件项目费用计算方法

计算软件项目的费用是项目管理的关键组成部分之一。费用计算方法可以帮助您确定项目的总成本&#xff0c;包括开发、测试、维护和其他相关费用。以下是一些常见的软件项目费用计算方法&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发…

【51单片机】8-按键

1.按键相关知识 在按键未被按下之前&#xff0c;电路中默认为高电平【1】&#xff1b; 按键被按下后&#xff0c;电路中默认为低电平【0】 1.按键工作原理 1.内部机械结构 内部是没有电路的&#xff0c;电路在引脚上&#xff0c;看着4个引脚&#xff0c;实际上里面两个引脚相互…

暗猝灭剂BHQ-1 NHS,916753-61-2,BHQ-1 SE

产品简介&#xff1a;黑洞猝灭剂-1&#xff08;BHQ-1&#xff09;被归类为暗猝灭剂&#xff08;一种非荧光发色团&#xff09;&#xff0c;被广泛用作各种荧光共振、能量转移&#xff08;FRET&#xff09;和DNA检测探针中&#xff0c;此类探针主要用于核酸分析及核酸结构研究。…

Docker export导出容器,重新运行导出的容器

需求 在部署程序时&#xff0c;程序内的人脸识别组件第一次运行需要去下载第三方软件包&#xff0c;下载好之后就不需要再进行下载了。由于程序最终部署在不能连接外网的服务器上&#xff0c;所以需要在能连接外网的服务器上先部署运行并下载相关组件。因此需要对容器进行导出&…

2023年【司钻(钻井)】考试题库及司钻(钻井)考试报名

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 司钻&#xff08;钻井&#xff09;考试题库考前必练&#xff01;安全生产模拟考试一点通每个月更新司钻&#xff08;钻井&#xff09;考试报名题目及答案&#xff01;多做几遍&#xff0c;其实通过司钻&#xff08;钻…

Linux- 网络编程初探

原始套接字&#xff08;Raw Socket&#xff09; 原始套接字&#xff08;Raw Socket&#xff09;是一种提供较低级别网络访问的套接字。通过使用原始套接字&#xff0c;应用程序可以直接发送或接收网络层如IP的数据包&#xff0c;或者传输层如TCP、UDP的段&#xff0c;而无需通…

hive数据库操作,hive函数,FineBI可视化操作

1、数据库操作 1.1、创建数据库 create database if not exists myhive;use myhive;1.2、查看数据库详细信息 desc database myhive;数据库本质上就是在HDFS之上的文件夹。 默认数据库的存放路径是HDFS的&#xff1a;/user/hive/warehouse内 1.3、创建数据库并指定hdfs存…

PASCAL数据集说明

文章目录 一.PASCAL数据集简介1.图像分割 一.PASCAL数据集简介 Pascal VOC2012数据集主要是针对视觉任务中监督学习提供标签数据&#xff0c;它有四个大类别&#xff0c;可以细分为二十个小类别&#xff1a; Person&#xff1a;personAnimal&#xff1a;bird, cat, cow, dog,…

【软件设计师-中级——刷题记录4(纯干货)】

目录 进度管理工具Grantt图&#xff1a;程序语言基础&#xff1a;高级语言源程序模式&#xff1a; 每日一言&#xff1a;持续更新中... 个人昵称&#xff1a;lxw-pro 个人主页&#xff1a;欢迎关注 我的主页 个人感悟&#xff1a; “失败乃成功之母”&#xff0c;这是不变的道理…