D359周赛复盘:贪心解决求最小和问题⭐⭐+较为复杂的双层线性DP⭐⭐

文章目录

    • 2828.判别首字母缩略词
      • 完整版
    • 2829.k-avoiding数组的最小总和(贪心解法)
      • 思路
      • 完整版
    • 类似题:2834.找出美丽数组的最小和
      • 思路
      • 完整版
    • 2830.销售利润最大化⭐⭐
      • 思路
        • DP数组含义
        • 递推公式
      • 完整版

2828.判别首字母缩略词

给你一个字符串数组 words 和一个字符串 s ,请你判断 s 是不是 words首字母缩略词

如果可以按顺序串联 words 中每个字符串的第一个字符形成字符串 s ,则认为 swords 的首字母缩略词。例如,"ab" 可以由 ["apple", "banana"] 形成,但是无法从 ["bear", "aardvark"] 形成。

如果 swords 的首字母缩略词,返回 true ;否则,返回 false

示例 1:

输入:words = ["alice","bob","charlie"], s = "abc"
输出:true
解释:words 中 "alice"、"bob" 和 "charlie" 的第一个字符分别是 'a'、'b' 和 'c'。因此,s = "abc" 是首字母缩略词。 

示例 2:

输入:words = ["an","apple"], s = "a"
输出:false
解释:words 中 "an" 和 "apple" 的第一个字符分别是 'a' 和 'a'。
串联这些字符形成的首字母缩略词是 "aa" 。
因此,s = "a" 不是首字母缩略词。

示例 3:

输入:words = ["never","gonna","give","up","on","you"], s = "ngguoy"
输出:true
解释:串联数组 words 中每个字符串的第一个字符,得到字符串 "ngguoy" 。
因此,s = "ngguoy" 是首字母缩略词。 

提示:

  • 1 <= words.length <= 100
  • 1 <= words[i].length <= 10
  • 1 <= s.length <= 100
  • words[i]s 由小写英文字母组成

完整版

class Solution {
public:bool isAcronym(vector<string>& words, string s) {string result = "";for(string word:words){result.push_back(word[0]);}if(result==s) return true;return false;}
};

2829.k-avoiding数组的最小总和(贪心解法)

给你两个整数 nk

对于一个由 不同 正整数组成的数组,如果其中不存在任何求和等于 k 的不同元素对,则称其为 k-avoiding 数组。

返回长度为 nk-avoiding 数组的可能的最小总和。

示例 1:

输入:n = 5, k = 4
输出:18
解释:设若 k-avoiding 数组为 [1,2,4,5,6] ,其元素总和为 18 。
可以证明不存在总和小于 18 的 k-avoiding 数组。

示例 2:

输入:n = 2, k = 6
输出:3
解释:可以构造数组 [1,2] ,其元素总和为 3 。
可以证明不存在总和小于 3 的 k-avoiding 数组。 

提示:

  • 1 <= n, k <= 50

思路

本题思路是贪心解法。不同正整数组成的数组,且需要选择可能的最小总和,因此需要从小到大开始取值。

我们可以使用一个set集合存储已经选择过的数字,使用 curr 来代表当前尝试选择的数字。开始时,curr 被设置为 1。

  1. 检查curr 是否已经在 used 中或者 k-curr是否在 used 中:
    • 如果 curr 已经被选择过,或者 k-curr 也被选择过(这意味着如果我们选择 curr ,会有一个和为 k 的对存在),那么我们应该跳过这个 curr ,并使 curr 加1
    • 否则,我们选择 curr ,增加总和,并将 curr 加入到 used 中。
  2. 最后返回总和。

完整版

  • 因为是找最小和,所以并不适合用组合总和那一套回溯的方法解决
class Solution {
public:int minimumSum(int n, int k) {set<int>used;int sum=0;for(int i=1;i<=n;i++){int cur=1;//从1开始尝试//只要不满足条件,就一直cur++,一直到满足条件为止!while(used.count(cur)||used.count(k-cur)){cur++;}sum+=cur;used.insert(cur);}return sum;}
};

举一个简单的例子来解释这个算法。考虑 n = 5 和 k = 4。

  • 首先选择数字 1,sum = 1used = {1}
  • 下一个数字是 2,但是我们不能选择2,因为 2+2 = 4,即 k。因此,我们跳过2。
  • 接着选择数字 3,sum = 4used = {1,3}
  • 选择数字 4,sum = 8used = {1,3,4}
  • 选择数字 5,sum = 13used = {1,3,4,5}
  • 最后选择数字 6,sum = 18used = {1,3,4,5,6}

因此,输出为 18。

类似题:2834.找出美丽数组的最小和

给你两个正整数:ntarget

如果数组 nums 满足下述条件,则称其为 美丽数组

  • nums.length == n.
  • nums 由两两互不相同的正整数组成。
  • 在范围 [0, n-1] 内,不存在 两个 不同 下标 ij ,使得 nums[i] + nums[j] == target

返回符合条件的美丽数组所可能具备的 最小 和。

示例 1:

输入:n = 2, target = 3
输出:4
解释:nums = [1,3] 是美丽数组。
- nums 的长度为 n = 2 。
- nums 由两两互不相同的正整数组成。
- 不存在两个不同下标 i 和 j ,使得 nums[i] + nums[j] == 3 。
可以证明 4 是符合条件的美丽数组所可能具备的最小和。

示例 2:

输入:n = 3, target = 3
输出:8
解释:
nums = [1,3,4] 是美丽数组。 
- nums 的长度为 n = 3 。 
- nums 由两两互不相同的正整数组成。 
- 不存在两个不同下标 i 和 j ,使得 nums[i] + nums[j] == 3 。
可以证明 8 是符合条件的美丽数组所可能具备的最小和。

示例 3:

输入:n = 1, target = 1
输出:1
解释:nums = [1] 是美丽数组。

提示:

  • 1 <= n <= 105
  • 1 <= target <= 105

思路

本题就和上面的贪心很像了,求得也是可能的最小和,所以需要从最小的数字开始取!

完整版

本题代码就和上面几乎一模一样了。因为求解的是可能的最小和,所以都是贪心来做。

class Solution {
public:long long minimumPossibleSum(int n, int target) {set<long long>used;int cur = 1;long long sum=0;for(int i=1;i<=n;i++){while(used.count(cur)||used.count(target-cur)){cur++;}used.insert(cur);sum+=cur;}return sum;}
};

2830.销售利润最大化⭐⭐

给你一个整数 n 表示数轴上的房屋数量,编号从 0n - 1

另给你一个二维整数数组 offers ,其中 offers[i] = [starti, endi, goldi] 表示第 i 个买家想要以 goldi 枚金币的价格购买从 startiendi 的所有房屋。

作为一名销售,你需要有策略地选择并销售房屋使自己的收入最大化。

返回你可以赚取的金币的最大数目。

注意 同一所房屋不能卖给不同的买家,并且允许保留一些房屋不进行出售。

示例 1:

输入:n = 5, offers = [[0,0,1],[0,2,2],[1,3,2]]
输出:3
解释:
有 5 所房屋,编号从 0 到 4 ,共有 3 个购买要约。
将位于 [0,0] 范围内的房屋以 1 金币的价格出售给第 1 位买家,并将位于 [1,3] 范围内的房屋以 2 金币的价格出售给第 3 位买家。
可以证明我们最多只能获得 3 枚金币。

示例 2:

输入:n = 5, offers = [[0,0,1],[0,2,10],[1,3,2]]
输出:10
解释:有 5 所房屋,编号从 0 到 4 ,共有 3 个购买要约。
将位于 [0,2] 范围内的房屋以 10 金币的价格出售给第 2 位买家。
可以证明我们最多只能获得 10 枚金币。

提示:

  • 1 <= n <= 10^5
  • 1 <= offers.length <= 10^5
  • offers[i].length == 3
  • 0 <= starti <= endi <= n - 1
  • 1 <= goldi <= 10^3

思路

题解:2830. 销售利润最大化 - 力扣(LeetCode)

DP数组含义

dp[i]的含义是:dp[i+1]表示销售编号不超过i的房屋的最大盈利。因为还要考虑房屋为0的情况。

如果用 dp[i] 而不是 dp[i + 1]来表示的话,那 dp[0]的意思就是不超过编号为0的。但是,我们还需要考虑 编号不超过-1的(有点抽象,意思就是一个房屋都不考虑),但是下标不能是-1,所以就要把 dp 数组的下标移一下 , 让它别越界。

递推公式

考虑编号为i的房屋卖或者不卖:

  • 不卖,dp[i+1]=dp[i]
  • 卖,遍历所有终点房屋是房屋i的方案,找收益最大的方案。

完整版

class Solution {
public:int maximizeTheProfit(int n, vector<vector<int>>& offers) {vector<int>dp(n+1,0);sort(offers.begin(),offers.end(),[](vector<int>&a,vector<int>&b){return a[1]<b[1];//按照下标1位置升序排序,也就是对购买请求按照房屋终点值从小到大排序});int index=0;//方案编号//dp[i+1]表示从前往后卖到编号(下标)是i的房子时,总的最大获利for(int i=0;i<n;i++){//不卖i房子dp[i+1]=dp[i];//卖i房子while(index<offers.size()&&i==offers[index][1]){dp[i+1]=max(dp[i+1],dp[offers[index][0]]+offers[index][2]);index++;}}return dp[n];//dp[n]就对应着卖到下标n-1的房子(也就是最后一栋房子)的最大获益}
};

注意不能像下面这么写,因为while循环可能根本进不去,也就是说可能根本不存在i==offers[index][1],即根本不存在以房屋i为结尾的方案,但是dp[i+1]最少也要=dp[i]

class Solution {
public://错误写法,while循环可能根本进不去int maximizeTheProfit(int n, vector<vector<int>>& offers) {vector<int>dp(n+1,0);sort(offers.begin(),offers.end(),[](vector<int>&a,vector<int>&b){return a[1]<b[1];//按照下标1位置升序排序});int index=0;//方案编号//dp[i+1]表示从前往后卖到编号(下标)是i的房子时,总的最大获利for(int i=0;i<n;i++){//不卖i房子//dp[i+1]=dp[i];//卖i房子while(index<offers.size()&&i==offers[index][1]){dp[i+1]=max(dp[i],max(dp[i+1],dp[offers[index][0]]+offers[index][2]));index++;}}return dp[n];//dp[n]就对应着卖到下标n-1的房子(也就是最后一栋房子)的最大获益}
};

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

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

相关文章

大数据系列教程之 Kafka基础

kafka概述 一、kafka概述 1.1 定义1.2 消息队列 1.2.1 传统消息队列的应用场景1.2.2 消息队列的两种形式1.3 Kafka 基础架构二、kafka安装部署 2.1安装部署 2.1.1.jar包下载2.1.2.解压到指定的文件夹下2.1.3.创建两个文件夹以供后续使用2.1.4. 修改配置文件 &#xff08;1&…

C语言基础之——结构体

前言&#xff1a;小伙伴们又见面啦&#xff0c;那么本篇文章&#xff0c;我们就将对C语言基础知识的最后一个章节——结构体展开讲解。 世上无难事&#xff0c;只要肯攀登&#xff01; 目录 一.什么是结构体 二.结构体讲解 1.结构体的声明和变量的定义 2.结构体成员的类型…

【Linux】多线程2——线程互斥与同步/多线程应用

文章目录 1. 线程互斥1.1 问题引入1.2 线程互斥的相关概念1.3 互斥量mutex1.4 互斥量实现原理1.5 死锁 2. 线程安全和可重入函数3. 线程同步3.1 同步概念3.2 条件变量 4. 生产消费模型4.1 基于阻塞队列的cp模型4.2 基于环形队列的cp模型POSIX信号量 5. 线程池5.1 互斥量RAII版本…

Mybatis中的关系映射

1.一对一的映射关系 一对一关系&#xff08;One-to-One&#xff09;表示两个实体对象之间存在唯一的关联关系。例如&#xff0c;一个学生只能拥有一个身份证。在 MyBatis 中&#xff0c;我们可以使用结果嵌套或一对一映射来处理一对一关系。 1.1 创建模型类和Vo类 package com…

Vue中启动提示polyfill缺少-webpack v5版本导致

安装 npm i node-polyfill-webpack-plugin 因为我们的项目使用webpack v5&#xff0c;其中polyfill Node核心模块被删除。所以&#xff0c;我们安装它是为了在项目中访问这些模块 vue.config.js文件 const { defineConfig } require("vue/cli-service"); const No…

二叉树的介绍

写在前面&#xff1a; 二叉树是数据结构课程中非常重要的内容&#xff0c;我们针对二叉树的概念、性质以及类型展开详细介绍。 一、概念 二叉树&#xff08;Binary Tree&#xff09;是n&#xff08;n>0&#xff09;个结点的有限集合&#xff0c;该集合或者空集&#xff0…

英语之美:用一句话解释句子结构

以下是一个包含主语、谓语、宾语、表语、定语、同位语、补足语和状语的扩展句子&#xff0c;使用 “I love you” 作为基础&#xff1a; “I, the person who truly loves you, consider our love a beautiful gift, and I love you more deeply with each passing day.” 在…

Android开机动画

Android开机动画 1、BootLoader开机图片2、Kernel开机图片3、系统启动时&#xff08;BootAnimation&#xff09;动画3.1 bootanimation.zip位置3.2 bootanimation启动3.3 SurfaceFlinger启动bootanimation3.4 播放开机动画playAnimation3.6 开机动画退出检测3.7 简易时序图 4、…

【微服务部署】三、Jenkins+Maven插件Jib一键打包部署SpringBoot应用Docker镜像步骤详解

前面我们介绍了K8SDockerMaven插件打包部署SpringCloud微服务项目&#xff0c;在实际应用过程中&#xff0c;很多项目没有用到K8S和微服务&#xff0c;但是用到了Docker和SpringBoot&#xff0c;所以&#xff0c;我们这边介绍&#xff0c;如果使用Jenkinsjib-maven-plugin插件打…

基于springboot实现websocket实时通讯启动项目报错

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

MySQL之事务与引擎

目录 一、事物 1、事务的概念 2、事务的ACID特点 3、事务之间的相互影响 4、Mysql及事务隔离级别(四种) 1、查询会话事务隔离级别 2、查询会话事务隔离级别 3、设置全局事务隔离级别 4、设置会话事务隔离级别 5、事务控制语句 6、演示 1、测试提交事务 2、测试事务回滚 4…

鲁棒优化入门(7)—Matlab+Yalmip两阶段鲁棒优化通用编程指南(下)

0.引言 上一篇博客介绍了使用Yalmip工具箱求解单阶段鲁棒优化的方法。这篇文章将和大家一起继续研究如何使用Yalmip工具箱求解两阶段鲁棒优化(默认看到这篇博客时已经有一定的基础了&#xff0c;如果没有可以看看我专栏里的其他文章)。关于两阶段鲁棒优化与列与约束生成算法的原…

山东专精特新企业申报流程

1.认定依据《山东省“专精特新”中小企业认定管理办法(鲁工信发)〔2020〕7号&#xff09;2.基本指标(必须同时具备) ①依法在省内注册经营3年以上&#xff0c;具有独立法人资格&#xff0c;符合中小企业划分标准&#xff0c;经营状况良好&#xff0c;财务体系健全&#xff0c;领…

【数学建模竞赛】数据预处理知识总结1——数据清洗

数据预处理是什么 在数学建模赛题中&#xff0c;官方给所有参赛选手的数据可能受到主观或客观条件的影响有一定的问题&#xff0c;如果不进行数据的处理而直接使用的话可能对最终的结果造成一定的影响&#xff0c;因此为了保证数据的真实性和建模结果的可靠性&#xff0c;需要…

再见,CSDN

从我2018年1月31日加入CSDN&#xff0c;到现在已经5年多的时间了。在这5年里&#xff0c;陆陆续续在CSDN上发布了很多论文阅读笔记、教程、技术文章等等&#xff0c;记录了我从大四到研究生再到工作这段时间的学习和成长轨迹。 我一直有备份个人资料的习惯&#xff0c;尤其是耗…

SpringBoot v2.7.x+ 整合Swagger3入坑记?

目录 一、依赖 二、集成Swagger Java Config 三、配置完毕 四、解决方案 彩蛋 想尝鲜&#xff0c;坑也多&#xff0c;一起入个坑~ 一、依赖 SpringBoot版本&#xff1a;2.7.14 Swagger版本&#xff1a;3.0.0 <dependency><groupId>com.github.xiaoymin<…

SpringBoot 的 MVC

1.1 MVC定义 MVC是Model、View、Controller的缩写&#xff0c;它是软件工程当中的一种软甲架构模式&#xff0c;它把软件系统分为模型 Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据View&#xff08;视图&#xff09;是应用程…

【LeetCode】328. 奇偶链表

328. 奇偶链表&#xff08;中等&#xff09; 思路 如果链表为空&#xff0c;则直接返回链表。 对于原始链表&#xff0c;每个节点都是奇数节点或偶数节点。头节点是奇数节点&#xff0c;头节点的后一个节点是偶数节点&#xff0c;相邻节点的奇偶性不同。因此可以将奇数节点和偶…

图:关键路径

1. AOE网 与AOV网不同&#xff0c;AOE是用边表示活动的图或者网。 1.AOE网的概念 在带权有向图中&#xff0c;以顶点表示事件&#xff0c;以有向边表示活动&#xff0c; 以边上的权值表示完成该活动的开销(如完成活动所需的时间)&#xff0c; 称之为用边表示活动的网络&…

基于Springcloud微服务框架 +VUE框架开发的智慧工地系统源码

建筑行业快速发展&#xff0c;各建筑工程的建设规模在不断扩大&#xff0c;各岗位工作人员的工作内容所涉及的方面也越来越广泛。随着信息技术水平不断提高,人工记录的方式已经不能够满足大项目的管理要求&#xff0c;就此&#xff0c;创造出一种新型的施工管理技术——智慧工地…