第 357 场力扣周赛题解

A 故障键盘

在这里插入图片描述

简单模拟

class Solution {
public:string finalString(string s) {string res;for (auto c: s)if (c != 'i')res.push_back(c);elsereverse(res.begin(), res.end());return res;}
};

B 判断是否能拆分数组

在这里插入图片描述

区间dp:定义 p i , j p_{i,j} pi,j表示子数组 n u m s [ i , j ] nums[i,j] nums[i,j]能否满足条件地拆分为 j − i + 1 j-i+1 ji+1个非空数组, p i , j p_{i,j} pi,j最多可由 p i + 1 , j p_{i+1,j} pi+1,j p i , j − 1 p_{i,j-1} pi,j1转移,注意特判 n u m s [ i , j ] nums[i,j] nums[i,j]为整个数组的情况。

class Solution {
public:bool canSplitArray(vector<int> &nums, int m) {int n = nums.size();int s[n + 1];//前缀和s[0] = 0;for (int i = 1; i <= n; i++)s[i] = s[i - 1] + nums[i - 1];int p[n][n];//1:可满足条件地拆分,0:不可满足条件地拆分for (int len = 1; len <= n; len++)for (int i = 0, j = i + len - 1; j < n; i++, j++) {if (len == 1)//长度为1满足条件p[i][j] = 1;else//当前区间和>=m 或当前区间为整个数组,才可能可以满足条件地拆分p[i][j] = s[j + 1] - s[i] >= m || len == n ? (p[i][j - 1] | p[i + 1][j]) : 0;}return p[0][n - 1];}
};

C 找出最安全路径

在这里插入图片描述
在这里插入图片描述

多源 b f s bfs bfs+二分:以所有小偷所在位置为源点跑多源 b f s bfs bfs,这样就求出了矩阵各个位置的安全系数,然后二分枚举答案,设当前枚举值为 r e s res res,判断当前枚举值是否可行:通过 b f s bfs bfs判断 ( 0 , 0 ) (0,0) (0,0) ( n − 1 , n − 1 ) (n-1,n-1) (n1,n1)之间是否存在这样的路径,使得该路径上任意位置的安全系数都不小于 r e s res res

class Solution {
public:int maximumSafenessFactor(vector<vector<int>> &grid) {int n = grid.size();int d[n][n];//记录位置的安全系数memset(d, -1, sizeof(d));//初始化未访问标志queue<pair < int, int> > q;for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)if (grid[i][j]) {//多源bfs的源点d[i][j] = 0;q.emplace(i, j);}int dr[4] = {1, -1, 0, 0};int dc[4] = {0, 0, 1, -1};while (!q.empty()) {//多源bfsauto [r, c] = q.front();q.pop();for (int k = 0; k < 4; k++) {int nr = r + dr[k];int nc = c + dc[k];if (nr < 0 || nr >= n || nc < 0 || nc >= n || d[nr][nc] != -1)continue;d[nr][nc] = d[r][c] + 1;q.emplace(nr, nc);}}int l = 0, r = 2 * (n - 1);int vis[n][n];//记录是否在当前枚举值的bfs过程中访问过memset(vis, -1, sizeof(vis));while (l < r) {//二分枚举答案int res = (l + r + 1) / 2;queue<pair < int, int> > q;if (d[0][0] >= res) {//(0,0)为源点vis[0][0] = res;q.emplace(0, 0);}while (!q.empty()) {//bfs判断当前枚举值是否可行auto [r, c] = q.front();q.pop();if (r == n - 1 && c == n - 1)break;for (int k = 0; k < 4; k++) {int nr = r + dr[k];int nc = c + dc[k];if (nr < 0 || nr >= n || nc < 0 || nc >= n || d[nr][nc] < res || vis[nr][nc] == res)continue;vis[nr][nc] = res;//标记当前枚举值的bfs过程中已访问q.emplace(nr, nc);}}if (vis[n - 1][n - 1] == res)l = res;elser = res - 1;}return l;}
};

D 子序列最大优雅度

在这里插入图片描述
在这里插入图片描述

堆+哈希:将 i t e m s items items按利润降序排序,然后将前 k k k个项目加入选择集合,然后枚举剩余的项目 i t e m s [ i ] items[i] items[i]

  • i t e m s [ i ] items[i] items[i]的项目类别在选择集合中已有,则直接跳过该项目
  • i t e m s [ i ] items[i] items[i]的项目类别没有在选择集合中
    • 若当前选择集合中存在出现次数大于1的项目,将其中利润最小的项目移出集合,同时将 i t e m s [ i ] items[i] items[i]加入集合
    • 若当前选择集合中不存在出现次数大于1的项目,结束枚举

实现可以用堆来维护选择集合中利润最小的项目,用哈希表记录各个类别在当前选择集合中的出现次数。

class Solution {
public:long long findMaximumElegance(vector<vector<int>> &items, int k) {sort(items.begin(), items.end(), [](const vector<int> &a, const vector<int> &b) { return a[0] > b[0]; });//按利润降序排序unordered_map<int, int> cnt;long long s = 0;//选择集合中项目的利润和priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> minheap;for (int i = 0; i < k; i++) {minheap.emplace(items[i][0], items[i][1]);s += items[i][0];cnt[items[i][1]]++;}long long res = s + (long long) (cnt.size() * cnt.size());for (int i = k; i < items.size(); i++) {int pi = items[i][0], ci = items[i][1];if (cnt[ci])//当前项目类别在选择集合中已有continue;while (!minheap.empty() && cnt[minheap.top().second] == 1)minheap.pop();if (minheap.empty())//当前选择集合中不存在出现次数大于1的项目break;auto [top_pi, top_ci] = minheap.top();minheap.pop();cnt[top_ci]--;cnt[ci]++;s += pi - top_pi;res = max(res, s + (long long) (cnt.size() * cnt.size()));}return res;}
};

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

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

相关文章

uniapp echarts 点击失效

这个问题网上搜了一堆&#xff0c;有的让你降版本&#xff0c;有的让你改源码。。。都不太符合预期&#xff0c;目前我的方法可以用最新的echarts。 这个方法就是由npm安装转为CDN&#xff0c;当然你可能会质疑用CDN这样会不稳定&#xff0c;那如果CDN的地址是本地呢&#xff1…

【stream的使用】使用stream.filter过滤List对象

Stream初相识 概括讲&#xff0c;可以将Stream流操作分为3种类型&#xff1a; 创建Stream Stream中间处理 终止Steam 每个Stream管道操作类型都包含若干API方法&#xff0c;先列举下各个API方法的功能介绍。 开始管道 主要负责新建一个Stream流&#xff0c;或者基于现有的数组…

Linux下共享windows 一键搞定

编写脚本 [rootlocalhost ~]# vim dd.sh#!/bin/bash yum -y install samba mkdir -p /home/shar sss dddecho " [share]comment Shared Folderpath /homebrowseable yeswritable yesguest ok yes " > /etc/samba/smb.confchmod x /home/* useradd qqqq s…

2023 电赛 E 题 激光笔识别有误--使用K210/Openmv/树莓派/Jetson nano实现激光笔在黑色区域的目标检测

1. 引言 1.1 激光笔在黑色区域目标检测的背景介绍 在许多应用领域&#xff0c;如机器人导航、智能家居和自动驾驶等&#xff0c;目标检测技术的需求日益增加。本博客将聚焦于使用K210芯片实现激光笔在黑色区域的目标检测。 激光笔在黑色区域目标检测是一个有趣且具有挑战性的…

AssetBundleBrowser导入报错解决方案

第一次导入AssetBundleBrowser遇到报错有 Assets\Scenes\AssetBundles-Browser-master\AssetBundles-Browser-master\Tests\Editor\ABModelTests.cs(13,7): error CS0246: The type or namespace name Boo could not be found (are you missing a using directive or an assem…

web系统测试思路

一、输入框 1、字符型输入框&#xff1a; &#xff08;1&#xff09;字符型输入框&#xff1a;英文全角、英文半角、数字、空或者空格、特殊字符“~&#xff01;#&#xffe5;%……&*&#xff1f;[]{}”特别要注意单引号和&符号。禁止直接输入特殊字符时&#xff0c;…

Python如何执行cmd命令和批处理文件

一、Python如何执行cmd命令 方法:使用os.system(command) 完整代码示例&#xff1a; import osos.system(path)二、Python如何执行批处理文件 1、导入subprocess模块 import subprocess2、创建Popen对象并传入.bat文件 subprocess.Popen(rC:\Test\test1.bat)完整代码示例…

Nginx常用功能

Nginx 介绍 Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器&#xff0c;而且支持热部署&#xff0c;几乎可以做到 7 * 24 小时不间断运行&#xff0c;即使运行几个月也不需要重新启动&#xff0c;还能在不间断服务的情况下对软件版本进行热更新。性能是 Nginx 最重要的…

java 两个数比较大小

多个自然数比较大小 package compare; public class Compare { public static void main(String[] args) { int [] c {3,2,5,8,6,4,9}; //找出最大数 //方法 int max0 ; //定义一个变量 for(int i0;i<c.length;i){ //遍历数组 f…

java中的垃圾收集机制

推荐 1 1 垃圾回收 1.1 java的gc堆中的对象而言&#xff0c;什么时候对象会从待回收状态变为激活状态&#xff08;垃圾变成非垃圾对象&#xff09; 当然可以。首先&#xff0c;为了使用 try-with-resources&#xff0c;您需要一个实现了 AutoCloseable 或 Closeable 接口的…

【项目多人协作的困扰】git-cli 解决 git merge 合并时 lock 文件变化,忘记重新安装依赖的问题

项目多人协作的困扰 相信大家多多少少都遇到过&#xff0c;当主线分支的代码&#xff0c;合入到自己的分支的时候&#xff0c;如果这时候&#xff0c;主线中有一些依赖的更新或者添加或者删除&#xff0c;如果合入之后&#xff0c;没有及时的install的话&#xff0c;项目启动的…

Stable Diffusion - Candy Land (糖果世界) LoRA 提示词配置与效果展示

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132145248 糖果世界 (Candy Land) 是一个充满甜蜜和奇幻的地方&#xff0c;由各种各样的糖果和巧克力构成。在糖果世界&#xff0c;可以看到&…

如何搭建个人的GPT网页服务

写在前面 在创建个人的 GPT网页之前&#xff0c;我登录了 Git 并尝试了一些开源项目&#xff0c;但是没有找到满足我个性化需求的设计。虽然许多收费的 GPT网页提供了一些免费额度&#xff0c;足够我使用&#xff0c;但是公司的安全策略会屏蔽这些网页。因此&#xff0c;我决定…

【力扣】344. 反转字符串 <首尾指针>

【力扣】344. 反转字符串 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 示例 1&#xff1a; 输入&#xff1a;s …

c/c++什么时候用指针,什么时候用值传递

在c/c++编程中,什么时候用指针来传递参数? 1.需要改变实参的时候,只能用指针 2.传递大量数据的时候,推荐用指针传递,因为值传递需要拷贝其每个元素,效率太低 3.需要遍历数组或频繁引用其元素时使用指针传递,使用指针(迭代器)遍历数组并赋值的效率总是明显快于下标遍历 …

Linux系统快速安装达梦8.0数据库

1用户和组创建&#xff1a; mkdir /home/dmdba (家目录创建用户目录&#xff09; groupadd dinstall &#xff08;用户组&#xff09; groupadd dmdba &#xff08;用户组&#xff09; useradd -d /home/dmdba -g dinstall dmdba &#xff08;家目录用户赋权&#…

2.4G芯片XL2408开发板,SOP16封装,芯片集成1T 8051内核单片机

XL2408开发板可用于2.4G芯片XL2408开发板的开发调试。XL2408烧录仿真需要使用WS_LINK。XL2408开发板烧录仿真需要接4根线&#xff1a;PA13:DIO&#xff0c;PA14:CLK&#xff0c;VCC&#xff0c;GND。 XL2408芯片集成射频收发机、频率收生器、晶体振荡器、调制解调器等功能模块,…

链表——LinkedList类的概述和实现

LinkedList类 1.1LinkedList类概述 LinkedList类底层是基于双向链表结构实现的&#xff0c;不同于ArrayList类和Vector类是基于数组实现的&#xff1b;LinkedList类是非线程安全的&#xff1b;LinkedList类元素允许为null&#xff0c;允许重复元素&#xff1b;LinkedList类插…

2023下半年软考初级网络管理员报名入口-报名流程-备考方法

软考初级网络管理员2023下半年考试时间&#xff1a; 2023年下半年软考初级网络管理员的考试时间为11月4日、5日。考试时间在全国各地一致&#xff0c;建议考生提前备考。共分两科&#xff0c;第一科基础知识考试具体时间为9:00到11:30&#xff1b;第二科应用技术考试具体时间为…

AWS 中文入门开发教学 49- S3 - 区域间复制

知识点 S3 存储桶内容在全球区域间进行复制官网 https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/replication.html 实战演习 在东京区建立存储桶 Name: woyaofuzhi启用版本控制(完成区域间复制必须开启版本控制) 在新加坡区建立存储桶 Name: woyaofuzhibac…