第 357 场力扣周赛题解

A 故障键盘

在这里插入图片描述

简单模拟

class Solution {
public:
    string finalString(string s) {
        string res;
        for (auto c: s)
            if (c != 'i')
                res.push_back(c);
            else
                reverse(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()) {//多源bfs
            auto [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;
            else
                r = 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;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

R语言3_安装SeurateData

环境Ubuntu22/20, R4.1 在命令行中键入&#xff0c; apt-get update apt install libcurl4-openssl-dev libssl-dev libxml2-dev libcairo2-dev libgtk-3-dev # libcairo2-dev :: systemfonts # libgtk :: textshaping进入r语言交互环境&#xff0c;键入&#xff0c; instal…

基于二进制草蝉优化算法选择特征并使用 KNN 进行训练(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 基于二进制草蝉优化算法选择特征并使用KNN&#xff08;K-Nearest Neighbors&#xff0c;K最近邻算法&#xff09;进行训练是一种…

安全基础 --- https详解 + 数组(js)

CIA三属性&#xff1a;完整性&#xff08;Confidentiality&#xff09;、保密性&#xff08;Integrity&#xff09;、可用性&#xff08;Availability&#xff09;&#xff0c;也称信息安全三要素。 https 核心技术&#xff1a;用非对称加密传输对称加密的密钥&#xff0c;然后…

分库分表之基于Shardingjdbc+docker+mysql主从架构实现读写分离 (三)

本篇主要说明&#xff1a; 1. 因为这个mysql版本是8.0&#xff0c;所以当其中一台mysql节点挂掉之后&#xff0c;主从同步&#xff0c;甚至双向数据同步都失效了&#xff0c;所以本篇主要记录下当其中的节点挂掉之后如何再次生效。另外推荐大家使用mysql5.7的版本&#xff0c;这…

ORA-12154:TNS:could not resolve the connect identifier specified

避免中文乱码 NLS_LANG: AMERICAN_AMERICA.UTF8 tnsnames.ora 所在目录 TNS_ADMIN: F:\Program\instantclient_11_2\NETWORK\ADMIN

MacBook触控板窗口管理 Swish for Mac

Swish for Mac是一款用于通过手势来控制mac应用窗口的软件&#xff0c;你可以通过这款软件在触控板上进行手势控制&#xff0c;你可以在使用前预设好不同手势的功能&#xff0c;然后就能直接通过这些手势让窗口按照你想要的方式进行变动了 Swish 支持 Haptick Feedback 震动反…

postgresql|数据库|MySQL数据库向postgresql数据库迁移的工具pgloader的部署和初步使用

前言&#xff1a; MySQL数据库和postgresql数据库之间的差异并不多&#xff0c;这里的差异指的是对SQL语言的支持两者并不大&#xff0c;但底层的东西差异是非常多的&#xff0c;例如&#xff0c;MySQL的innodb引擎概念&#xff0c;数据库用户管理&#xff0c;这些和postgresq…

ruby调试

如果下载 ruby-debug-ide gem install ruby-debug-ide vscode 下载 ruby扩展 1&#xff0c; ruby 2&#xff0c;修改launch.json

windows .gitignore 加入文件名后 依然可以从git status中看到文件问题

最近在学git&#xff0c;对着b站的视频操作&#xff0c;结果很简单的添加.gitignore文件操作&#xff0c;up主的正常隐藏&#xff0c;我的却一直出问题。 百思不得其解&#xff0c;网上各种啥啥啥清缓存都没讲到点上。 最后发现是.gitignore文件有问题&#xff0c;windows默认…

LNMP及论坛搭建

安装 Nginx 服务 systemctl stop firewalld systemctl disable firewalld setenforce 0 1.安装依赖包 #nginx的配置及运行需要pcre、zlib等软件包的支持&#xff0c;因此需要安装这些软件的开发包&#xff0c;以便提供相应的库和头文件。 yum -y install pcre-devel zlib-devel…

Linux【网络编程】之深入理解TCP协议

Linux【网络编程】之深入理解TCP协议 TCP协议TCP协议段格式4位首部长度---TCP报头长度信息 TCP可靠性&#xff08;确认应答&#xff09;&& 提高传输效率确认应答(ACK)机制32位序号与32为确认序号 16位窗口大小---自己接收缓冲区剩余空间的大小16位紧急指针---紧急数据处…

Vue电商项目--订单和支付

提交订单 没有组件&#xff0c;先搬组件 配置路由 然后静态pay页面就有了 这里提交订单不是简单的直接进行路由的跳转&#xff0c;而且要拿你支付的数据向服务器发请求 提交订单 请求地址 /api/order/auth/submitOrder?tradeNo{tradeNo} 请求方式 POST 参数类型 参数名…

边写代码边学习之LSTM

1. 什么是LSTM 长短期记忆网络 LSTM&#xff08;long short-term memory&#xff09;是 RNN 的一种变体&#xff0c;其核心概念在于细胞状态以及“门”结构。细胞状态相当于信息传输的路径&#xff0c;让信息能在序列连中传递下去。你可以将其看作网络的“记忆”。理论上讲&a…

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;可以看到&…

Qt、C/C++环境中内嵌LUA脚本、实现LUA函数的调用执行

Qt、C/C环境中内嵌LUA脚本、实现LUA函数的调用执行 Chapter1. Qt、C/C环境中内嵌LUA脚本、实现LUA函数的调用执行1、LUA简介2、LUA脚本的解释器和编译器3、C环境中内嵌LUA执行LUA函数调用4、Qt内嵌LUA执行LUA函数调用5、运行结果6、内嵌LUA脚本在实际项目中的案例应用 Chapter1…

手机变电脑2023之虚拟电脑droidvm

手机这么大的内存&#xff0c;装个app来模拟linux&#xff0c;还是没问题的。 app 装好后&#xff0c;手指点几下确定按钮&#xff0c;等几分钟就能把linux桌面环境安装好。 不需要敲指令&#xff0c; 不需要对手机刷机&#xff0c; 不需要特殊权限&#xff0c; 不需要找驱…

opencv-32 图像平滑处理-高斯滤波cv2.GaussianBlur()

在进行均值滤波和方框滤波时&#xff0c;其邻域内每个像素的权重是相等的。在高斯滤波中&#xff0c;会将中心点的权重值加大&#xff0c;远离中心点的权重值减小&#xff0c;在此基础上计算邻域内各个像素值不同权重 的和。 基本原理 在高斯滤波中&#xff0c;卷积核中的值不…

第一篇:一文看懂 Vue.js 3.0 的优化

我们的课程是要解读 Vue.js 框架的源码&#xff0c;所以在进入课程之前我们先来了解一下 Vue.js 框架演进的过程&#xff0c;也就是 Vue.js 3.0 主要做了哪些优化。 Vue.js 从 1.x 到 2.0 版本&#xff0c;最大的升级就是引入了虚拟 DOM 的概念&#xff0c;它为后续做服务端渲…

Scala按天写入日志文件

如果希望把每天出错的信息写入日志文件&#xff0c;每天新建一个文件。 package test.scala import java.io.{File, FileWriter} import java.text.SimpleDateFormat import java.util.{Calendar, Date} import scala.concurrent.ExecutionContext.Implicits.global import sc…

CS录屏教程,录制游戏需要注意哪些方面?

​最近有个CS手游的玩家小伙伴咨询想要做一些游戏视频录制&#xff0c;但是不知道有哪些好用的工具来使用&#xff0c;对于游戏录制我们其实是需要注意一些事项的&#xff0c;想要观众的观感上比较好就需要把握好视频的帧率等问题&#xff0c;下面我们就来看看录制方法和需要注…