LeetCode---374周赛

题目列表

2951. 找出峰值

2952. 需要添加的硬币的最小数量

2953. 统计完全子字符串

2954. 统计感冒序列的数目

一、找到峰值

这个简单的模拟,代码如下

class Solution {
public:
    vector<int> findPeaks(vector<int>& mountain) {
        int n=mountain.size();
        vector<int>ans;
        for(int i=1;i<n-1;i++){
            if(mountain[i]>mountain[i-1]&&mountain[i]>mountain[i+1])
                ans.push_back(i);
        }
        return ans;
    }
};

二、需要添加的硬币的最小数量

题目要求我们添加最小的金币数,使得我们能用已有的金币凑出1~target中的任何一个数值,这题看着简单,但是思维难度比第三题高,是那种思维题,这里讲一下思路:要先排序,因为我们在顺序时,会更容易找出规律

我们要保证1~target中的每一个元素都能被构造,那么什么情况下一个数是不能被构造出来的?假设我们能用前i个数构造出[1,x],现在我们要构造x+1这个数,怎么办?

1.如果coins[i+1] == x+1,我们当然能构造出来x+1,且一直到x+x+1我们都能构造出来

2.如果coins[i+1] < x+1,我们也能构造出x+1,且一直到x+coin[i+1]我们都能构造出来

3.如果coins[i+1]>x+1呢?显然我们就无法构造出x+1了(因为我们已经排过序了,所以coins[i+1]!=1),那么我们是补1呢?还是直接补一个x+1?显然我们肯定是补x+1,这样我们能构造出的数据区间最大为[1,2*x+1]

如此循环,得到答案,因为我们每次加的金币都会让数据区间最大化,贪心的思路如下图

这题的关键是我们要往加粗的两个语句上去思考,本质是一个数学归纳的思想

代码如下

class Solution {
public:
    int minimumAddedCoins(vector<int>& coins, int target) {
        int ans=0;
        int t=0;//表示[1,t]区间内的值可以构造
        sort(coins.begin(),coins.end());
        int i=0,n=coins.size();//用来遍历数组
        while(t<target){
            while(i<n&&t+1>=coins[i]){
                t+=coins[i];
                i++;
                if(t>=target)
                    return ans;
            }
            t+=(t+1);
            ans++;
        }
        return ans;
    }
};

 三、统计完全子字符串

这题的完全字符串有两个条件,分别对应我们思路的两个部分:

1.条件1是标准的滑动窗口问题,共有26种固定大小的窗口需要考虑

2.条件2意味着需要将字符串拆分成符合条件的子字符串来考虑,因为子字符串是连续的,一旦出现两个相邻字符的大小相差>2,那么就不可能有一个满足条件的子字符串同时包含这两个字符

代码如下

class Solution {
public:
    int countCompleteSubstrings(string word, int k) {
        int i=0;
        int n=word.size(),ans=0;
        function<int(int,int)>getNum=[&](int start,int end)->int{
            int ret=0;
            for(int i=1;i<=26;i++){//一共有26个大小不同的窗口
                //滑动窗口
                int sz=i*k;
                if(sz>end-start) break;
                int cnt[26]={0};
                for(int l=start,r=start,s=0;r<end;r++){
                    int idx=word[r]-'a';
                    if(++cnt[idx]==k) s++;
                    if(cnt[idx]==k+1) s--;//注意不是>k
                    if(r-l+1>sz){
                        idx=word[l]-'a';
                        if(--cnt[idx]==k) s++;
                        if(cnt[idx]==k-1) s--;//注意不是<k
                        l++;
                    }
                    if(i==s) ret++;
                }  
            }
            return ret;
        };

        while(i<n){
            int begin=i;
            i++;
            while(i<n&&abs(word[i]-word[i-1])<=2)
                i++;
            if(i-begin>=k) ans+=getNum(begin,i);//[begin,i)的区间符合条件二 
        }
        return ans;
    }
};

四、统计感冒序列的数目

数学题,题解如下 

 代码如下

const int MX=100000;
const int MOD=1e9+7;
typedef long long LL;
LL fac[MX],inv_fac[MX];
//快速幂
LL POW(LL x,LL y){
    LL ret=1;
    while(y){
        if(y&1) ret=(ret*x)%MOD;
        x=(x*x)%MOD;
        y>>=1;
    }
    return ret;
}

//预处理
int init=[](){
    fac[0]=1;
    for(int i=1;i<MX;i++){
        fac[i]=fac[i-1]*i%MOD;
    }

    //逆元
    inv_fac[MX-1]=POW(fac[MX-1],MOD-2);
    for(int i=MX-1;i>0;i--){
        inv_fac[i-1]=inv_fac[i]*i%MOD;
    }
    return 0;
}();

long long comb(int n,int k){//n!/((n-k)!*k!)
    return fac[n]*inv_fac[k]%MOD*inv_fac[n-k]%MOD;
}

class Solution {
public:
    int numberOfSequence(int n, vector<int>& sick) {
        int m=sick.size();
        int total=n-m;
        long long ans=comb(total,sick[0])*comb(total-sick[0],n-sick.back()-1)%MOD;
        total-=sick[0]+n-sick.back()-1;
        int x=0;
        for(int i=0;i<m-1;i++){
            int k=sick[i+1]-sick[i]-1;
            if(k){
                x+=k-1;
                ans=ans*comb(total,k)%MOD;
                total-=k;
            }
        }
        return ans*POW(2,x)%MOD;
    }
};

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

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

相关文章

【附源码】完整版,Python+Selenium+Pytest+POM自动化测试框架封装

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、测试框架简介 …

[每周一更]-(第76期):Go源码阅读与分析的方式

读源码可以深层理解Go的编写方式&#xff0c;理解作者们的思维方式&#xff1b;也有助于对Go语法用法深刻的理解&#xff0c;我们从这一篇说一下如何读源码&#xff0c;从哪些源码着手&#xff0c;从 简单到深入的方式学习源码&#xff1b; 学习源码也是一个修炼过程&#xff0…

科技改变旅游,道观漫游可视化:智能化管理助力道观游览

道观漫游可视化是一种通过技术手段实现道观游览的可视化展示方式&#xff0c;让游客能够更加直观地了解道观的历史、文化和建筑特色。 随着旅游业的不断发展&#xff0c;道观漫游可视化已经成为了旅游行业中的一个重要方向&#xff0c;吸引了越来越多的游客前来体验。 道观漫游…

Excel 动态拼接表头实现导出

public class Column {//单元格内容private String content;//字段名称&#xff0c;用户导出表格时反射调用private String fieldName;//这个单元格的集合private List<Column> listTpamscolumn new ArrayList<Column>();int totalRow;int totalCol;int row;//exc…

vue使用echarts显示中国地图

项目引入echarts以后&#xff0c;在页面创建canvas标签 引入一个公共js文件&#xff08;下面这段代码就是china.js文件&#xff09; (function (root, factory) {if (typeof define function && define.amd) {// AMD. Register as an anonymous module.define([ex…

孜然地址引导页V9(带后台)

刚刚在浏览之前经常访问的网站的时候我发现他不用那个域名了&#xff0c;然后我见这个页面好看&#xff0c;就把他干下来了&#xff0c;然后把给他写了个后台。另外如果你的子页面收录多的话&#xff0c;人家百度访问你的子页面会显示404的&#xff0c;所以为了流量可观安装这个…

【带头学C++】----- 九、类和对象 ---- 9.8 动态对象创建

目录 9.8 动态对象创建 9.8.1 动态创建对象基础概念 9.8.2 C语言创建动态对象的 9.8.3 new创建动态对象 9.8.4 delete释放动态对象 9.8.5 动态对象数组 9.8 动态对象创建 9.8.1 动态创建对象基础概念 在创建数组时&#xff0c;我们通常需要预先指定数组的长度&#xff0…

三个臭皮匠(ctr,nerdctl,crictl)顶一个诸葛亮(docker)

文章目录 containerd简介 nerdctl简介安装精简 Minimal 安装完整Full 安装启动服务 命令参数容器运行容器列出容器详情容器日志容器进入容器停止容器删除镜像列表镜像拉取镜像标签镜像导出镜像导入镜像删除镜像构建配置tab键配置加速配置仓库http方式https方式 ctr简介命令参数…

java--Calendar

1.Calendar ①代表的是系统此刻时间对应的日历 ②通过它可以单独获取、修改时间中的年、月、日、时、分、秒等(月份是从0开始的)。 2.Calender日历类的常见方法 注意&#xff1a;calender是可变对象&#xff0c;一旦修改后其对象本身表示的时间将产生变化。

8. MySQL 触发器

目录 概述 定义 触发器特性&#xff1a; 基础操作 创建触发器 NEW和OLD 其他操作 查看触发器 删除触发器 注意事项 概述 定义 触发器&#xff0c;就是一种特殊的存储过程。触发器和存储过程一样是一个能够完成特定功能、存储在数据库服务器上的SQL片段&#xff0c;但是触…

Serverless单体架构的崛起

在过去的几十年里&#xff0c;我们见证了应用架构以快速的速度演变。当我还是一个年轻的程序员时&#xff0c;开始编写一个简单的代码库&#xff0c;我们可以称之为单体应用。 我记得为前端编写了一些HTML/CSS&#xff0c;后端用了一些Java。但后来&#xff0c;随着时代发展和…

系统设计之Nginx

一、Nginx是什么 Nginx ("engine x") 是一个开源的&#xff0c;支持高性能、高并发的 Web 服务和代理服务软件。它是由俄罗斯人 Igor Sysoev 开发的&#xff0c;最初被应用在俄罗斯的大型网站 www.rambler.ru 上。后来作者将源代码以类 BSD 许可的形式开源出来供全球…

2023年山东省职业院校技能大赛信息安全管理与评估第一阶段样题

2023年山东省职业院校技能大赛信息安全管理与评估样题 竞赛需要完成三个阶段的任务&#xff0c;分别完成三个模块&#xff0c;总分共计 1000 分。三个模块内容和分值分别是&#xff1a; \1. 第一阶段&#xff1a;模块一 网络平台搭建与设备安全防护&#xff08;240 分钟&…

Nginx负载均衡实战

&#x1f3b5;负载均衡组件 ngx_http_upstream_module https://nginx.org/en/docs/http/ngx_http_upstream_module.html upstream模块允许Nginx定义一组或多组节点服务器组&#xff0c;使用时可以通过多种方式去定义服务器组 样例&#xff1a; upstream backend {server back…

2023中国(海南)国际高尔夫旅游文化博览会 暨国际商界峰层·全球华人高尔夫精英巡回赛 全国颍商自贸港行盛大启幕

2023中国&#xff08;海南&#xff09;国际高尔夫旅游文化博览会&#xff08;以下简称“海高博”&#xff09;暨全国颍商走进海南自贸港于12月7-9日在海口观澜湖盛大开幕。该活动由中国国际贸易促进委员会海南省委员会、海南省旅游和文化广电体育厅主办&#xff0c;中国国际商会…

windows安装rabbitmq

注&#xff1a;安装 rabbitmq 之前需要先安装 erlang 语言包&#xff0c;否则安装过程会报错 erlang 语言包名称&#xff1a;otp_win64_25.3.2.3.exe。erlang 和 rabbitmq 有严格的版本对应。 部分版本对应&#xff1a; 安装 1、安装 erlang 并配置环境变量 1.1 双击 otp_…

在Deepin中安装x11vnc工具并结合内网穿透软件实现远程访问桌面

文章目录 1. 安装x11vnc2. 本地远程连接测试3. Deepin安装Cpolar4. 配置公网远程地址5. 公网远程连接Deepin桌面6. 固定连接公网地址7. 固定公网地址连接测试 x11vnc是一种在Linux系统中实现远程桌面控制的工具&#xff0c;它的原理是通过X Window系统的协议来实现远程桌面的展…

007:vue实现与iframe实现页面数据通信

首页先搭建一个html页面和vue页面&#xff0c;在vue页面中&#xff0c;嵌入我们需要的iframe页面 文章目录 1. 搭建 html 页面和 vue 页面2. 实现 iframe 向 vue 页面通信3. 在实现 vue 向 iframe 页面通信 1. 搭建 html 页面和 vue 页面 暂定为 iframeDemo.html 和 vueDemo.v…

Linux中的SNAT与DNAT实践

Linux中的SNAT与DNAT实践 1、SNAT的介绍1.1&#xff0c;SNAT概述1.2&#xff0c;SNAT源地址转换过程1.3&#xff0c;SNAT转换 2、DNAT的介绍2.1&#xff0c;DNAT概述2.2&#xff0c;DNAT转换前提条件2.3&#xff0c;DNAT的转换 3、防火墙规则的备份和还原4、tcpdump抓包工具的运…

App 设计工具中的启动任务和输入参数

目录 创建 startupFcn 回调 定义输入 App 参数 可以使用 App 设计工具创建一个特殊函数&#xff0c;该函数在 App 启动时、但在用户与 UI 进行交互之前执行。此函数称为 startupFcn 回调&#xff0c;它非常适用于设置默认值、初始化变量或执行影响 App 初始状态的命令。例如&…