LeetCode --- 411周赛

news2024/11/15 11:09:14

题目列表

3258. 统计满足 K 约束的子字符串数量 I

3259. 超级饮料的最大强化能量

3260. 找出最大的 N 位 K 回文数

3261. 统计满足 K 约束的子字符串数量 II

一、统计满足K约束的子字符串数量I

这种要求满足区间内某种性质的题,一般都可以用滑动窗口来做。这题也是同理,我们的思路是用滑动窗口来维护以 r 为右端点的满足题目区间性质的最长子字符串,然后统计答案即可,代码如下

class Solution {
public:
    int countKConstraintSubstrings(string s, int k) {
        int n = s.size(), ans = 0;
        int cnt[2]{};
        for(int l = 0, r = 0; r < n; r++){
            cnt[s[r]-'0']++;
            while(cnt[0] > k && cnt[1] > k){
                cnt[s[l]-'0']--;
                l++;
            }
            ans += r - l + 1; // 统计以 r 为右端点的满足要求的子串个数
        }
        return ans;
    }
};

二、超级饮料的最大强化能量

这题和打家劫舍很相似。本题要求如果切换饮料要么需要有一个小时等待时间,本质就是不能相邻时间饮用不同的饮料,我们可以定义f[i]表示第 i 小时喝饮料A的最大能量,g[i]表示第 i 小时喝饮料B的最大能量,对于 f[i] 来说,它可以选择不切换饮料,从f[i-1]转移来,也可以选择谢欢饮料,从g[i-2]转移来,故转移方程为 f[i] = max(f[i-1],g[i-2]) + a[i],同理,g[i] = max(g[i-1],f[i-2]) + b[i]。为了防止下标越界,我们需要初始化。代码如下

class Solution {
    using LL = long long;
public:
    long long maxEnergyBoost(vector<int>& a, vector<int>& b) {
        int n = a.size();
        // f[i] 表示第 i 小时喝a饮料的最大能量
        // g[i] 表示第 i 小时喝b饮料的最大能量
        // f[i] = max(f[i-1], g[i-2]) + a[i]
        // g[i] = max(g[i-1], f[i-2]) + a[i]
        vector<LL> f(n + 2), g(n + 2);
        for(int i = 0; i < n; i++){
            f[i+2] = max(f[i+1], g[i]) + a[i];
            g[i+2] = max(g[i+1], f[i]) + b[i];
        }
        return max(f.back(), g.back());
    }
};

三、找出最大的N位K回文数

一般的想法就是去构造,由于回文数是中心对称的,所以我们只要枚举一半的数位填什么,就能知道整个回文数是多少,其次,由于题目只要求能被 k 整除的最大的n位回文数,所以我们贪心的让每一位都从 9 到 0 的顺序进行枚举,我们构造出的第一个满足条件的回文数就是最大的,我们可以直接返回true表示找到了一个合法的回文数,为了判断构造的回文数是否符合条件,我们还需要一个参数来记录 % k 的结果。

这题的关键在于如何进行取模?因为位数n太大会导致数据越界,我们计算出整个数之后再进行取模是不可取的,那么该如何做呢?根据取模的性质,(a+b)%k = ((a%k) + (b%k))%k,我们可以提前预处理得到每个位上的数 % k 的结果。

比如说800 % k = (100 % k + ... + 100%k)%k = (8 * 100 % k) % k,我们可以先计算出 10^i % k的结果,再结合枚举的数计算整体 % k 的值,这样就不会越界了,代码如下

class Solution {
public:
    string largestPalindrome(int n, int k) {
        vector<int> pow10(n);
        pow10[0] = 1;
        for (int i = 1; i < n; i++) {
            pow10[i] = pow10[i - 1] * 10 % k;
        }

        string ans(n, '0');
        int m = (n + 1) / 2;
        vector<vector<bool>> vis(m + 1, vector<bool>(k));
        auto dfs = [&](auto&& dfs, int i, int j) -> bool {
            if (i == m) {
                return j == 0;
            }
            vis[i][j] = true;
            for (int d = 9; d >= 0; d--) { // 贪心:从大到小枚举
                int j2;
                if (n % 2 && i == m - 1) { // 正中间
                    j2 = (j + d * pow10[i]) % k;
                } else {
                    j2 = (j + d * (pow10[i] + pow10[n - 1 - i])) % k;
                }
                if (!vis[i + 1][j2] && dfs(dfs, i + 1, j2)) {
                    ans[i] = ans[n - 1 - i] = '0' + d;
                    return true;
                }
            }
            return false;
        };
        dfs(dfs, 0, 0);
        return ans;
    }
};

四、统计满足K约束的子字符串数量II

和第一题相比,第四题有多次查询需要处理,如何处理?

我们可以通过第一题的思路去尝试发现一些规律来帮助我们解决问题,首先,我们能知道每一个右端点都对应着一个左端点left,使得它的之间的长度最长,其次这些左端点的位置还是单调增的,因为滑动窗口一直在往右移动。

下面结合一个示例来帮助我们找到规律

代码如下

class Solution {
    using LL = long long;
public:
    vector<long long> countKConstraintSubstrings(string s, int k, vector<vector<int>>& q) {
        int n = s.size();
        vector<int>left(n);
        vector<LL> pre(n+1);
        int cnt[2]{};
        for(int l = 0, r = 0; r < n; r++){
            cnt[s[r] - '0']++;
            while(cnt[0] > k && cnt[1] > k){
                cnt[s[l] - '0']--;
                l++;
            }
            left[r] = l;
            pre[r+1] = pre[r] + r - l + 1;
        }
        
        vector<LL> ans(q.size());
        for(int i = 0; i < q.size(); i++){
            int l = q[i][0], r = q[i][1];
            int j = lower_bound(left.begin() + l, left.begin() + r + 1, l + 1) - left.begin(); // left[j] > l
            ans[i] = (long long)(j - l + 1) * (j - l) / 2 + pre[r+1] - pre[j];
        }
        return ans;
    }
};

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

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

相关文章

STM32MP157_uboot_初次编译

STM32MP157_uboot_初次编译 前言&#xff1a; 为了快速入门&#xff0c;这边选择直接使用正点原子提供的uboot源码&#xff0c;先体验一下uboot的编译流程&#xff0c;为后面的移植原厂uboot做环境准备。 1、获取正点原子的uboot源码&#xff08;复制到虚拟机里面&#xff09; …

均值漂移算法原理及Python实践

均值漂移算法&#xff08;Mean Shift Algorithm&#xff09;是一种基于密度的非参数聚类算法&#xff0c;其原理主要基于核密度估计和梯度上升方法。以下是均值漂移算法原理的详细解析&#xff1a; 1. 基本思想 均值漂移算法的基本思想是通过迭代地更新数据点的位置&#xff…

Android APK优化系列瘦身篇:实战一个APK从11MB压缩到4MB,APK无用资源去除与代码压缩、混淆,瘦身维度的选型分析

目录&#xff1a; 为什么要进行APK瘦身呢&#xff1f;APK瘦身主要是瘦身哪些呢&#xff1f; a. 优化resources.arsc&#xff1a; b. res优化 c. lib优化 d. 资源优化&#xff0c;代码混淆和压缩总结 一、为什么要进行APK瘦身呢&#xff1f; 减少下载时间和流量消耗&#xff1…

el-table 表格自定义添加表格数据后自动滚动到最底部

动态表格&#xff0c;可以新增行列数&#xff0c;为了用户体验&#xff0c;新增后超出表格流体高度后&#xff0c;自动滚动到最下方 需要element-plus如下api 代码如下&#xff1a; const addCapacity () > {inputList.value.push({name: "",desc: "&quo…

案例-登录认证

案例-登录认证 登录认证。 最终实现的效果就是用户必须登录之后&#xff0c;才可以访问后台系统中的功能。 1. 登录功能 1.1 需求 在登录界面中&#xff0c;我们可以输入用户的用户名以及密码&#xff0c;然后点击 “登录” 按钮就要请求服务器&#xff0c;服务端判断用户输入…

streamlit创建python的web应用

目录 简介基本示例&#xff1a;运行 Streamlit 应用&#xff1a; 简介 Streamlit 是一个开源的 Python 库&#xff0c;可以让你快速创建和分享自定义的 Web 应用&#xff0c;尤其适用于机器学习和数据科学项目。它简化了将数据脚本转换为交互式应用的过程&#xff0c;不需要任…

【案例54】登录显示ORA-28000 账户被锁定

问题现象 登录后显示ora-28000 账户被锁定 问题分析 ORA-28000 表示账户被锁定。 错误原因分析 1、密码多次输入错误&#xff1a;这是最常见的导致账户锁定的原因之一。用户在尝试登录数据库时&#xff0c;如果连续多次输入错误的密码&#xff0c;数据库系统为了安全起见&am…

sheng的学习笔记-AI-生成式方法

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 需要额外的知识对应连接&#xff1a; EM&#xff1a;sheng的学习笔记-AI-EM算法-CSDN博客 贝叶斯&#xff1a; sheng的学习笔记-AI-贝叶斯&#xff08;Bayesian&#xff09;分类-CSDN博客 高斯混合模型&#xff1a;shen…

利用Matlab求解常微分方程(dsolve与ode45)

1.微分方程的基本概念 含义微分方程&#xff08;英语&#xff1a;Differential equation&#xff0c;DE&#xff09;是一种数学方程&#xff0c;用来描述某一类函数与其导数之间的关系。微分方程的通解是一个符合方程的函数。而在初等数学的代数方程里&#xff0c;解析解是一个…

RocketMQ~刷盘机制、主从复制方式、存储机制

刷盘机制 生产者发布MQ给Brocker&#xff0c;Brocker在存储这些数据的时候&#xff0c;需要进行刷盘&#xff0c;分为同步刷盘和异步刷盘。 在同步刷盘中需要等待一个刷盘成功的ACK&#xff0c;同步刷盘对MQ消息可靠性来说是一种不错的保障&#xff0c;但是性能上会有较大影响…

推荐5款能够写出高质量文章的ai写作工具!

在如今的信息爆炸时代&#xff0c;内容创作者面临着前所未有的挑战&#xff1a;如何快速而高质量地产生内容&#xff0c;满足日益增长的读者群需求。 无论是自媒体人士、博客作者、学者还是学生&#xff0c;大家都在寻找一种能够提升写作效率与质量的解决方案。 幸运的是&…

oneapi 获取通义千问模型密钥

1、打开 阿里云百炼大模型平台&#xff0c;点击开通&#xff0c;登录账号 2、获取密钥 3、查看模型名称&#xff0c;可以添加到 oneapi 的渠道中 别忘了添加向量模型

基于Java+SpringBoot+Vue的师生共评的作业管理系统设计与实现

基于JavaSpringBootVue的师生共评的作业管理系统设计与实现 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方…

MySQL从入门到精通(第9-10章)

文章目录 9 子查询9.1 需求分析与问题解决9.1.1 实际问题9.1.2 子查询的使用9.1.3 子查询的分类 9.2 单行子查询9.2.1 单行比较操作符9.2.2 代码示例9.2.3 HAVING中的子查询9.2.4 CASE中的子查询9.2.5 子查询中的空值问题9.2.6 非法使用子查询 9.3 多行子查询9.3.1 多行比较操作…

文心快码 Baidu Comate 前端工程师观点分享:以文心快码 Baidu Comate为例,智能代码助手需要什么(三)

本系列视频来自百度工程效能部的前端研发经理杨经纬&#xff0c;她在由开源中国主办的“AI编程革新研发效能”OSC源创会杭州站105期线下沙龙活动上&#xff0c;从一款文心快码&#xff08;Baidu Comate&#xff09;前端工程师的角度&#xff0c;分享了关于智能研发工具本身的研…

数据库的读写分离技术MVCC

本文纯理论学习,无知之处请给与包涵! 写作不易,觉得好,麻烦请点广告支持下 分享一下! 作者不支持读者的任何抽象行为&#xff0c;阅读本文产生的任何后果&#xff0c;作者概不负责 MVCC 英文全称叫多版本并发控制协议. 以前做ORACLE DBA时候没有听说过.后来转到MYSQL DBA就听说…

Vastbase——单机安装部署

一、依赖软件环境检查 yum install -y zlib-devel libaio libuuid readline-devel krb5-libs libicu libxslt tcl perl openldap pam openssl-devel libxml2 bzip2 二、系统和环境配置 1.检测及关闭目标部署机器的防火墙 sudo firewall-cmd --state sudo systemctl status …

分布式数据一致性小结

文章目录 简介一、线性一致性二、顺序一致性三、因果一致性四、以客户端为中心的一致性参考 简介 分布式一致性问题包括数据一致性问题和事务一致性问题。在此仅关注数据一致性问题&#xff0c;数据一致性问题是因为分布式系统下数据需要复制而导致的。 而数据一致性模型就是…

关于使用Object.create(null)来创建空对象,而不直接使用{}的优势

文章目录 前言1. 使用Object.create(null) 和 直接{}的区别2.子类继承父类3. 子类继承父类---进阶 前言 问题&#xff1a;为什么vue源码中使用Object.create(null)来创建空对象&#xff0c;而不直接使用{}??? 1. 使用Object.create(null) 和 直接{}的区别 优势&#xff1a…

Qt:玩转QPainter序列四

前言 接着干源码 正文 先看源码&#xff0c;然后我们逐条分析 QPainter 是一个强大的绘图类&#xff0c;用于在 QWidget、QImage、QPixmap 等设备上进行绘图操作。下面我会详细解释你提到的各个函数和属性&#xff0c;并通过示例展示它们的用法。 1. font() 和 setFont() …