力扣第 411 场周赛题解

news2024/9/24 17:15:53

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

给你一个 二进制 字符串 s 和一个整数 k

如果一个 二进制字符串 满足以下任一条件,则认为该字符串满足 k 约束

  • 字符串中 0 的数量最多为 k
  • 字符串中 1 的数量最多为 k

返回一个整数,表示 s 的所有满足 k 约束 

子字符串

的数量。

示例 1:

输入:s = "10101", k = 1

输出:12

解释:

s 的所有子字符串中,除了 "1010""10101" 和 "0101" 外,其余子字符串都满足 k 约束。

示例 2:

输入:s = "1010101", k = 2

输出:25

解释:

s 的所有子字符串中,除了长度大于 5 的子字符串外,其余子字符串都满足 k 约束。

示例 3:

输入:s = "11111", k = 1

输出:15

解释:

s 的所有子字符串都满足 k 约束。

提示:

  • 1 <= s.length <= 50
  • 1 <= k <= s.length
  • s[i] 是 '0' 或 '1'

题目说满足任意条件即可成立,也就是说两个条件同时都不满足时结果不成立.看到题目数据范围,我们可以采用暴力枚举每一种情况,时间复杂度O(n^2),可以过.

class Solution {
public:
    int countKConstraintSubstrings(string s, int k) {
        int count = 0;
        for (int i = 0; i < s.size(); i++) {
            int zeroCount = 0;
            int oneCount = 0;
            for (int j = i; j < s.size(); j++) {
                if (s[j] == '0') zeroCount++;
                if (s[j] == '1') oneCount++;
                if (zeroCount <= k || oneCount <= k) {
                    count++;
                }
            }
        }
        return count;
    }
};

但是我们要想优化,可以考虑以下标0,1,2,3.....为右端点的子串个数统计出来,例如10101,以下标0为右端点的子串为1;以下标1为右端点的子串为0,10;以下标2为右端点的子串为101,01,1......以此类推,然后把这些所有子串个数都加起来就是答案,但是,例如1010101,k=2,枚举到下标为5,即101010,就不符合要求了,但可以把子串缩小,例如01010,就符合要求了,不难发现如果这个长度为5的子串符合要求,那么长度更短的子串也符合要求,所以比如说右端点为0时,左端点最远为第一个0的位置,左端点L=1,右端点R=5,那么从[L,R],[L+1,R].....到[R,R]都是符合的,一共R-L+1个数,把这些数的个数加到答案里面就可以了,同时,当右端点增大时,比如增大到末尾的1时,就不符合要求了,所以要将左端点增大,所以可以推出当右端点增大时,左端点要么不变,要么增大,符合滑动窗口的思想,时间复杂度O(n),n为字符串长度,L只会增加,不会减少,所以为O(n).

class Solution {
public:
    int countKConstraintSubstrings(string s, int k) {
        int cnt[2],l=0,ans=0;
        for(int i=0;i<s.size();i++){
            cnt[s[i]%2]++;
            while(cnt[0]>k&&cnt[1]>k)
                cnt[s[l++]%2]--;
            ans+=i-l+1;
        }
        return ans;
    }
};

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

来自未来的体育科学家给你两个整数数组 energyDrinkA 和 energyDrinkB,数组长度都等于 n。这两个数组分别代表 A、B 两种不同能量饮料每小时所能提供的强化能量。

你需要每小时饮用一种能量饮料来 最大化 你的总强化能量。然而,如果从一种能量饮料切换到另一种,你需要等待一小时来梳理身体的能量体系(在那个小时里你将不会获得任何强化能量)。

返回在接下来的 n 小时内你能获得的 最大 总强化能量。

注意 你可以选择从饮用任意一种能量饮料开始。

示例 1:

输入:energyDrinkA = [1,3,1], energyDrinkB = [3,1,1]

输出:5

解释:

要想获得 5 点强化能量,需要选择只饮用能量饮料 A(或者只饮用 B)。

示例 2:

输入:energyDrinkA = [4,1,1], energyDrinkB = [1,1,3]

输出:7

解释:

  • 第一个小时饮用能量饮料 A。
  • 切换到能量饮料 B ,在第二个小时无法获得强化能量。
  • 第三个小时饮用能量饮料 B ,并获得强化能量。

提示:

  • n == energyDrinkA.length == energyDrinkB.length
  • 3 <= n <= 105
  • 1 <= energyDrinkA[i], energyDrinkB[i] <= 105

例如,[1,3,1]和 [3,1,1],题目中说每小时只能饮用一种能量饮料,且相邻的下标不能连续选择不同数组中的数,所以如果选定一个数组,可以连着选,但是选不同数组,只能跳着选.同时,题目保证所有数为正数,所以最后一个数一定要选(比如第一个数组,只选3和既选3又选1,肯定后者更优)  (因为题目给了两个数组a,b,从a数组选若干数,从b数组选若干数,相当于从两个数组中各选了一个子序列,所以对于子序列题目,可以考虑最后一个数是怎么选的),所以选了最后一个数之后,接下来分两种情况,要么选同一个数组中的倒数第二个数,要么跳着选另一个数组的倒数第三个数(不能隔两个数选下一个,因为结果不优),所以这道题本质就是选或不选的题,比如选完第一个数组的最后一个1之后,接下来选第一个数组中的3,转化为从[1,3],[3,1]的选择情况;接下来选第二个数组中的3,就转化为没有数字选了.所以需要两个变量,一个是用i表示从下标0到下标i的数,第二个是用j表示从第i个位置选的数是属于a数组还是b数组(j=0表示从a数组选,也就是选了ai;j=1表示从b数组选,也就是选了bi).用dfs(i,j)表示从下标[0,i]中选,且下标i选的数为a[i](j==0),或者b[i](j==1),所以就是dfs(i-1,j)和dfs(i-2,1-j),二者取最大值,定义数组c,将数组a和b放进c中(下标0就是a,1就是b),还要考虑如果i<0,结果就越界了,所以直接返回0,所以dfs(i,j)=max(dfs(i-1,j),dfs(i-2,1-j))+c[j][i].结果返回的就是max(dfs(n-1,0),dfs(n-1,1)).考虑到整个递归过程中有大量重复递归调用(递归入参相同),由于递归函数没有副作用,同样的入参无论计算多少次,算出来的结果都是一样的,因此可以用记忆化搜索来优化.(python直接加@cache).也可以把记忆化搜索翻译成递推,当i=0时,递归到-2,i的范围是从-2到n-1,有n+2个数,j就是0,1.把dfs(-2,j)翻译成f[0][j],dfs(-1,j)翻译成f[1][j],dfs(i,j)=max(dfs(i-1,j),dfs(i-2,1-j))+c[j][i]翻译成f[i+2][j]=max(f[i+1][j],f[i][1-j])+c[j][i].(如果把数组c中的i加上2后,当i=n-1时,就越界了,所以不能加2,还有就是仅仅是在f数组前面插入状态,没在c数组前插入状态,所以不改变c数组),答案为 max(f[n+1][0],f[n+1][1]).

class Solution {
public:
    long long maxEnergyBoost(vector<int>& a, vector<int>& b) {
        int n = a.size();
        vector<array<long long,2>>f(n + 2);
        for (int i = 0; i < n; i++) {
            f[i+2][0]=max(f[i+1][0],f[i][1])+a[i];
            f[i+2][1]=max(f[i+1][1],f[i][0])+b[i];
        }
        return max(f[n+1][0],f[n+1][1]);
    }
};

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

给你两个 正整数 n 和 k

如果整数 x 满足以下全部条件,则该整数是一个 k 回文数

  • x 是一个 回文数。
  • x 可以被 k 整除。

以字符串形式返回 最大的  n 位 k 回文数

注意,该整数 不 含前导零。

示例 1:

输入: n = 3, k = 5

输出: "595"

解释:

595 是最大的 3 位 k 回文数。

示例 2:

输入: n = 1, k = 4

输出: "8"

解释:

1 位 k 回文数只有 4 和 8。

示例 3:

输入: n = 5, k = 6

输出: "89898"

提示:

  • 1 <= n <= 105
  • 1 <= k <= 9

在i位置填了数字a,也同时在n-1-i位置填了数字a,在生成答案之前,只需考虑回文数%k的结果,例如三位数,中间位置初始化为0,则有9种情况(题目说不含前导零):101,202,.....909,接下来考虑每一个数中间填0~9又有10种情况,仅仅是三位数就有这么多种情况,如何减少考虑的数字的数量?这里有一个数学公式:(a+b)%k=(a%k+b%k)%k------取模恒等式,就是不用把整个数字生成出来去看%k的结果,可以在生成数字过程中直接%k.用i表示当前填到数字的哪一位,用j表示填的数字%k的结果.一开始为(0,0),当i=m时表示所有数都填好了(m=n/2上取整,比如一个6位数,从右到左i依次取0,1...5,当i=2时,还没填好,当i=3时,所有数字都填好了,比如一个5位数,i=2时继续填,i=3时填好了),即从起点(0,0)--->终点(m,0),m=n/2上取整.期间状态为从(1,(9*10的n-1次方+9)%k).....到(1,(1*10的n-1次方+1)%k),又可以递归到(i+1,....)...可以将题目考虑为图论问题,就是经过一些点最后到达终点,路径可以表示出填哪些数字,就是dfs暴搜加上vis数组记录访问过的结点.

class Solution {
public:
bool dfs(int i,int j,int n,int k,int m,vector<int>& pow10,string& ans,vector<vector<int>>&vis){
    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(i+1,j2,n,k,m,pow10,ans,vis)){
            ans[i]=ans[n-1-i]='0'+d;
            return true;
        }
    }
    return false;
}
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<int>>vis(m+1,vector<int>(k));
    dfs(0,0,n,k,m,pow10,ans,vis);
    return ans;
    }
};

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

给你一个 二进制 字符串 s 和一个整数 k

另给你一个二维整数数组 queries ,其中 queries[i] = [li, ri] 。

如果一个 二进制字符串 满足以下任一条件,则认为该字符串满足 k 约束

  • 字符串中 0 的数量最多为 k
  • 字符串中 1 的数量最多为 k

返回一个整数数组 answer ,其中 answer[i] 表示 s[li..ri] 中满足 k 约束的子字符串的数量。

示例 1:

输入:s = "0001111", k = 2, queries = [[0,6]]

输出:[26]

解释:

对于查询 [0, 6], s[0..6] = "0001111" 的所有子字符串中,除 s[0..5] = "000111" 和 s[0..6] = "0001111" 外,其余子字符串都满足 k 约束。

示例 2:

输入:s = "010101", k = 1, queries = [[0,5],[1,4],[2,3]]

输出:[15,9,3]

解释:

s 的所有子字符串中,长度大于 3 的子字符串都不满足 k 约束。

提示:

  • 1 <= s.length <= 105
  • s[i] 是 '0' 或 '1'
  • 1 <= k <= s.length
  • 1 <= queries.length <= 105
  • queries[i] == [li, ri]
  • 0 <= li <= ri < s.length
  • 所有查询互不相同

此题和第一题不同在于本题是要求子串中有多少个合法的子串,用Left[i]表示以i为右端点的子串通过滑动窗口求出的Left的位置,例如,一子串范围为[L,R],如果这个范围里所有的Left[i]都在L的左边,那么这里面所有子串都符合要求,长度为m的子串有1+2+3+...+m=(m+1)*m/2个子串,如果某个子串中有指向外面的,也有指向里面的,如果右端点指向的Left[i]在询问的区间内,那么直接可以把r-l+1加到答案里面,不难发现,每个位置都对应一个r-l+1,可以理解为关于r-l+1的子数组的和,就可以用前缀和优化.所以该题就分为两种情况:找一个位置,在这个位置左边所有子串全部都是合法的,直接用等差数列之和,在这个位置右边的子串,用前缀和算出来,所以回答每次询问,就取决于能不能快速找到分界位置,因为滑动窗口的左端点是不断向右移动的,所以这个Left数组是一个有序数组,可以在这个有序数组中二分找到大于等于L第一个位置作为分界位置.

class Solution {
public:
    vector<long long> countKConstraintSubstrings(string s, int k, vector<vector<int>>& queries) {
        int n=s.length(),m=queries.size();
        vector<int>left(n);
        vector<long long>sum(n+1);
        int cnt[2]{},l=0;
        for (int i=0;i<n;i++){
            cnt[s[i]%2]++;
            while(cnt[0]>k&&cnt[1]>k){
                cnt[s[l++]%2]--;
            }
            left[i]=l;
            // 计算 i-left[i]+1 的前缀和
            sum[i+1]=sum[i]+i-l+1;
        }
        vector<long long>ans(m);
        for (int i=0;i<m;i++){
            int l=queries[i][0],r=queries[i][1];
            int j=lower_bound(left.begin()+l,left.begin()+r+1,l)-left.begin();
            ans[i]=sum[r+1]-sum[j]+(long long)(j-l+1)*(j-l)/2;
        }
        return ans;
    }
};

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

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

相关文章

系统编程-进程初步1

5 进程初步 一、认识进程 -- 进程Process是指计算机中已运行的程序&#xff0c;是系统进行资源分配和调度的基本单位&#xff0c;是操作系统结构的基础 -- 程序运行起来就是一个进程 进程存在于运行内存中程序存在于硬盘中 -- windows下查看进程使用任务管理器进行查看 1…

EXCEL——Vlookup17个高级用法

大纲 一、基本语法 1、参数详解 二、入门篇 1、单条件查找 2、屏蔽查找返回的错误值 三、进阶篇 1、反向查找 2、包含查找 3、区间查找 4、含通配符查找 5、多列查找 6、多区域查找 四、高级篇 1、多条件查找 2、合并单元格查找 3、带合并单元格的多条件查找 …

轻松玩转音频剪辑:推荐四大必备工具!

在这个多媒体时代&#xff0c;音频剪辑技能变得至关重要。无论是制作短视频、音频节目&#xff0c;还是音乐创作&#xff0c;一款得心应手的音频剪辑工具都能让你事半功倍。今天&#xff0c;我们将推荐几款热门音频剪辑工具&#xff0c;助你轻松玩转声音世界 福昕音频剪辑 链…

【数学建模】趣味数学模型——等额还款数学模型

问题 在银行贷款中&#xff0c;通常采用等额还款。假定银行贷款的年利率为 p&#xff0c;贷款 k 元&#xff0c;分 m 年采用每月等额还款方式还清。问每月还款多少钱&#xff1f;总共还的钱是多少&#xff1f;每月还款中还本金和利息各是多少元&#xff1f; 如果考虑每月等额…

Webrtc之SDP协议

SDP简介 SDP 最常用于 RTC 实时通话的协商过程&#xff0c;在 WebRTC 中&#xff0c;通信双方在连接阶段使用 SDP 来协商后续传输过程中使用的音视频编解码器(codec)、主机候选地址、网络传输协议等。 在实际的应用过程中&#xff0c;通信双方可以使用 HTTP、WebSocket、Data…

MySQL数据库主从复制

主从复制原理 MySQL的复制类型 基于语句的复制 &#xff08;默认&#xff09;基于行的复制混合类型的复制MySQL主从复制的工作过程 主从复制设置 主从复制时基于二进制文件的所以需要打开二进制文件 主数据库 在MySQL配置文件/etc/my.cnf修改或增加 #启用了MySQL的二进制日…

集合及数据结构第三节————包装类和简单认识泛型

系列文章目录 集合及数据结构第三节————包装类和简单认识泛型 包装类和简单认识泛型 基本数据类型和对应的包装类装箱和拆箱泛型泛型类的使用裸类型(Raw Type) &#xff08;了解&#xff09;泛型如何编译的泛型的上界泛型方法 文章目录 系列文章目录集合及数据结构第三节…

linux上常见问题

1.普通用户下&#xff0c;不能使用sudo 解决方法 1.切换到root用户下执行该指令是没有问题的 2.更改配置文件sudoers 1.进入root用户下&#xff1a;su - 2.编辑sudoers :visudo 此时就打开了一个文件 3.在该文件找到这么一行内容&#xff1a;root ALL(ALL) ALL 4.在该行的…

CUDA-MODE课程笔记 第8课: CUDA性能检查清单

我的课程笔记&#xff0c;欢迎关注&#xff1a;https://github.com/BBuf/how-to-optim-algorithm-in-cuda/tree/master/cuda-mode CUDA-MODE课程笔记 第8课: CUDA性能检查清单 课程笔记 这节课实际上算是CUDA-MODE 课程笔记 第一课: 如何在 PyTorch 中 profile CUDA kernels 这…

(16)prometheus(普罗米修斯)监控的搭建

prometheus是由go语言编写的&#xff0c;监控服务器是否正常运行的工具&#xff0c;使用experter工具收集数据&#xff0c;传到prometheus服务器。可以结合grafana图形化和pagerduty报警发送有邮件和信息。 实验环境&#xff1a; 关掉防火墙和selinux grafana.example.com 1…

为什么CNAPP将会是网络安全领域的一场革命?

随着越来越多的组织开始业务上云&#xff0c;云原生应用保护变得越来越复杂。众多高度碎片化产品&#xff0c;很难去保护一个广泛的、动态变化的攻击场景。当前想要解决这一难题&#xff0c;有一个很好的思路&#xff0c;就是云原生应用保护平台&#xff08;CNAPP&#xff09;。…

第二届机器人与软件工程前沿国际会议在贵阳闭幕

2024年8月13日&#xff0c;第二届机器人与软件工程前沿国际会议&#xff08;FRSE 2024&#xff09;在贵阳圆满闭幕。 本次大会由长沙理工大学主办&#xff0c;贵州大学、湖南科技大学、爱迩思出版社&#xff08;ELSP&#xff09;&#xff0c;ESBK国际学术交流中心、AC学术平台…

Python 办公自动化 处理 Excel 数据 【1】推荐

话说学好办公自动化,走遍天下都不怕&#xff01;&#xff01;&#xff01; 好的&#xff0c;现在开始。 因为是一些办公自动化的应用场景&#xff0c;所以需要电脑支持excel、word和ppt以及python的运行环境。 如果有电脑不支持Excel word ppt的以及python环境下载安装配置可…

Spring 声明式事务 @Transactional

目录 一、添加依赖 二、Transactional 作用 三、Transactional详解 3.1 rollbackFor 3.2 事务隔离级别 3.3 Spring 事务传播机制 Spring 声明式事务 Transactional的使用很简单&#xff0c;只需要添加依赖&#xff0c;在需要的方法或者类上添加 Transactional注解即可。 …

珠海盈致联手深圳盈怡成功上线“混工单柔性智能生产装备”

珠海盈致联手深圳盈怡推出的“混工单柔性智能生产装备”在全面而严密的市场测试中显示出卓越的性能和极高的用户满意度。 经过两年的精细研发和内部测试优化&#xff0c;该柔性生产线已成功完成了样板工厂的所有环节&#xff0c;在深圳市贤丰科技有限公司成功试跑上线&#xf…

联影医疗笔试考什么?如何通过联影在线测评|附真题库面试攻略

职小豚 一、联影医疗公司介绍 嘿&#xff0c;朋友们&#xff01;今天咱们来聊聊联影医疗这家在医疗领域大放异彩的企业。 联影医疗&#xff0c;那可是医疗科技界的一颗璀璨明星&#xff01;它就像一位勇敢的探索者&#xff0c;在医疗影像设备的研发和创新道路上不断前行。 联…

机器视觉运动控制一体机VPLC532E在汽车胶带缠绕的开放式CNC应用

市场应用背景 在汽车线束和零配件中&#xff0c;胶带缠绕是一种常见且重要的加工工艺&#xff0c;主要用于线束/零配件的捆扎、固定、绝缘保护等应用。在缠绕头控制下&#xff0c;胶带均匀缠绕在汽车线束/零配件表面&#xff0c;完成缠绕后&#xff0c;系统自动执行切割。汽车…

(普通用户)Cannot connect to the Docker daemon at unix:///var/run/docker.sock.

报错&#xff1a; Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?#大概像以下的报错内容 MernyPierreMBP:~ merny24$ docker info Client:Version: 26.1.4Context: defaultDebug Mode: falseServer: ERROR: Cann…

可以给IP地址申请SSL证书实现HTTPS访问吗?

IP地址证书&#xff0c;全称为IP地址的SSL/TLS证书&#xff0c;是一种专为公网IP地址&#xff08;或内网映射的外网&#xff09;颁发的数字证书。这种证书由受信任的证书颁发机构&#xff08;CA&#xff09;签发&#xff0c;旨在确保通过该IP地址进行的通信&#xff08;特别是H…

家务一键搞定!Astribot S1机器人让你秒变“甩手掌柜“

星尘智能 在这个忙碌的现代社会&#xff0c;谁不渴望拥有一个能够帮我们处理繁琐家务的得力助手呢&#xff1f;就在最近&#xff0c;星尘智能公司推出的全新AI机器人Astribot S1&#xff0c;正在让这个梦想变为触手可及的现实。 Astribot S1 Astribot S1 性能对比 从官网给出的…