LeetCode---383周赛

news2024/11/16 18:35:33

题目列表

3028. 边界上的蚂蚁

3029. 将单词恢复初始状态所需的最短时间 I

3030. 找出网格的区域平均强度

3031. 将单词恢复初始状态所需的最短时间 II

一、边界上的蚂蚁

这题没什么好说的,模拟就行,本质就是看前缀和有几个为0。

代码如下

class Solution {
public:
    int returnToBoundaryCount(vector<int>& nums) {
        int ans = 0, sum = 0;
        for(auto x:nums){
            sum += x;
            ans += sum==0;
        }
        return ans;
    }
};

 二、将单词恢复初始状态所需要的最短时间I&II

这题如果没有什么其他思路,我们直接暴力枚举也是可以直接过的(数据范围比较小),这里先写一个暴力的代码,下面会讲一个更快的方法

这题的本质其实就是判断特定长度的前后缀是否相同,这里我们直接暴力枚举一个个字符进行判断

代码如下

class Solution {
public:
    int minimumTimeToInitialState(string word, int k) {
        int n = word.size(), ans = 1;
        for(int i = k; i < n; i += k){
            bool flag = false;
            for(int j = 0;j < n - i; j++){
                if(word[j] != word[i+j]){
                    flag = true;
                    break;
                }
            }
            if(flag) ans++;
            else break;
        }
        return ans;
    }
};

那么如果数据范围变大(如下图),我们又该如何去做呢???(第四题) 

很显然,这题是关于字符串匹配的相关问题,很容易就能想到KMP算法,但是KMP的常规用法是用来求模式串在其他文本串中是否存在及其所匹配的子串的起始下标的,而这题只有一个字符串,且所求也不同,看着根本就没有任何关系,但是真的是这样吗?

(如果对KMP算法不了解,建议先去看一下这一篇文章:如何更好地理解和掌握 KMP 算法? - 知乎)

我们来想想kmp中有什么是只跟一个字符串有关系的?很显然是next数组,那么next数组的含义是什么?next[i] 表示以 i 为结尾的字符串的前缀和后缀的最大匹配字符串的长度。

比如 ababcabab的next数组为 0 0 1 2 1 1 2 3 4

在之前我就说过这题本质其实就是判断特定长度的前后缀是否相同,在结合next数组的含义,是不是已经有点感觉了?

但是还不够,根据目前的对next数组的理解,我们只能得到该字符串的前后缀最长匹配字符串的长度,但是这个不一定满足题目要求,所以我们需要枚举从大到小所有满足字符串前后缀匹配的长度,从而找到最小的操作次数,如何做?

如果我们想要得到次大的满足字符串前后缀匹配字符串的长度,该长度的字符串必然包含在最大长度的前后缀匹配的字符串中,举个例子,比如 ababcabab 这个字符串,next.back()=4,即 abab 这个字符串,那么次大的满足前后缀匹配的字符串必然在 abab 之中,即 ab,也就是 abab 这个字符串的最大前后缀匹配的字符串长度,所以次大的前后缀匹配字符长度为2,同理,我们能得到从大到小所有满足字符串前后缀匹配字符串的长度

代码如下

class Solution {
public:
    int minimumTimeToInitialState(string word, int k) {
        //kmp求next数组
        int n = word.size();
        int next[n];next[0]=0;
        for(int i=1,j=0;i<n;i++){
            while(j&&word[i]!=word[j])
                j=next[j-1];
            if(word[i]==word[j])
                j++;
            next[i]=j;
        }
        //从大到小枚举所有的前后缀匹配的字符串长度
        int res=next[n-1];
        while(res&&(n-res)%k!=0)
            res = next[res-1];
        if(res) return (n-res)/k;
        else return (n+k-1)/k;
    }
};

这里介绍另一种算法----z函数(又叫扩展kmp)----是之前暴力做法的优化

之前暴力做法浪费时间的地方在于每次判断前后缀是否匹配,都需要从头开始,但实际上前面匹配的信息能帮助我们跳过一些没有必要的比较

它的大体思路和kmp的思路是一样的,都是用空间去换取时间,用额外的空间去记录一些有用的信息,从而减少无用比较的次数,优化时间复杂度,有兴趣的可以去了解一下。

代码如下

class Solution {
public:
    int minimumTimeToInitialState(string word, int k) {
        int n = word.size();
        vector<int> z(n);
        int left = 0, right = 0;
        for(int i = 1; i < n; i++){
            if(i <= right)
                z[i] = min(z[i-left], right-i+1);
            while(i+z[i] < n && word[z[i]]==word[i+z[i]]){
                left = i;
                right = z[i]+i;
                z[i]++;
            }
            if(i%k==0&&z[i]==n-i)
                return i/k;
        }
        return (n+k-1)/k;
    }
};

三、找出网格的区域平均强度

读懂题目意思,直接模拟即可

代码如下

class Solution {
public:
    vector<vector<int>> resultGrid(vector<vector<int>>& image, int threshold) {
        int n = image.size(), m = image[0].size();
        vector<vector<int>> dp(n+1,vector<int>(m+1));
        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                dp[i+1][j+1] = dp[i][j+1] + dp[i+1][j] + image[i][j] - dp[i][j];
            }
        }
        vector<vector<int>> v(n,vector<int>(m));
        auto t = v;
        for(int i = 0; i < n-2; i++){
            for(int j = 0; j < m-2; j++){
                bool ok = false;
                for(int k = i; k <= i+2; k++)
                    if(abs(image[k][j]-image[k][j+1])>threshold || abs(image[k][j+1]-image[k][j+2])>threshold)
                        ok = true;
                for(int k = j; k <= j+2; k++)
                    if(abs(image[i][k]-image[i+1][k])>threshold || abs(image[i+1][k]-image[i+2][k])>threshold)
                        ok = true;
                if(ok) continue;
                int sum = (dp[i+3][j+3] - dp[i+3][j] - dp[i][j+3] + dp[i][j])/9;
                for(int x = i; x <= i+2; x++){
                    for(int y = j; y <= j+2; y++){
                        t[x][y]++;
                        v[x][y]+=sum;
                    }
                }
            }
        }
        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                if(t[i][j]) v[i][j]/=t[i][j];
                else v[i][j]=image[i][j];
            }
        }
        return v;
    }
};

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

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

相关文章

【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱1(附带项目源码)

效果演示 文章目录 效果演示系列目录前言人物和视角基本控制简单的背包系统和物品交互绘制背包UI脚本控制 源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第25篇中&#xff0c;我们将…

游戏服务器哪家强?国内几款主流云服务器测评

游戏服务器租用多少钱一年&#xff1f;1个月游戏服务器费用多少&#xff1f;阿里云游戏服务器26元1个月、腾讯云游戏服务器32元&#xff0c;华为云26元&#xff0c;游戏服务器配置从4核16G、4核32G、8核32G、16核64G等配置可选&#xff0c;游戏专业服务器公网带宽10M、12M、15M…

【大厂AI课学习笔记】【1.6 人工智能基础知识】(1)人工智能、机器学习、深度学习之间的关系

6.1 人工智能、机器学习与深度学习的关系 必须要掌握的内容&#xff1a; 如上图&#xff1a;人工智能>机器学习>深度学习。 机器学习是人工智能的一个分支&#xff0c;该领域的主要研究对象是人工智能&#xff0c;特别是如何在经验学习中改进具体算法的性能。 深度学习…

算法||实现典型数据结构的查找、添加和删除数据 并分析其时间和空间复杂度

实现典型数据结构的查找、添加和删除数据 并分析其时间和空间复杂度 线性结构&#xff1a; 数组&#xff1a;是一种线性表数据结构&#xff0c;它用一组连续的内存空间&#xff0c;来存储一组具有相同类型的数据。 查找数据 &#xff1a;随机访问 流程图 /** 查询元素下标…

02 数据库管理 数据表管理

文章目录 数据库管理数据表管理基础数据类型表的基本操作 数据库管理 查看已有库 show databases; 创建库 create database 库名 [character set utf8]; e.g. 创建stu数据库&#xff0c;编码为utf8 create database stu character set utf8; create database stu charsetutf8;…

LSF 主机状态 unreach 分析

在LSF集群运行过程中&#xff0c;有主机状态变为 unreach。熟悉LSF的朋友都知道主机状态为 unreach 表示主机上的 SBD 服务中断服务了&#xff0c;但其它服务 LIM 和 RES 还在正常运行。 影响分析 那么主机上的 SBD 服务中断的影响是什么呢&#xff1f; 我们需要先明白 SBD …

Java 学习和实践笔记(6)

各数据类型所占的空间&#xff1a; byte: 1个字节 short&#xff1a;2个字节 int&#xff1a;4个 long&#xff1a;8个 float&#xff1a;4个 double: 8个 char:1个 boolean:1bit 所有引用数据类型都是4个字节&#xff0c;实际其值是指向该数据类型的地址。 上图中稍特…

使用Softing edgeConnector模块将云轻松连接到Siemens PLC

一 工业边缘的连接解决方案 云服务提供商 (CSP) 引入了服务和功能&#xff0c;以简化基于云的工业物联网解决方案的实施。Azure Industrial IoT Platform或AWS IoT SiteWise支持标准协议和接口&#xff0c;例如OPC UA或MQTT。但是&#xff0c;如果您希望在典型的旧改项目中连接…

Debezium发布历史122

原文地址&#xff1a; https://debezium.io/blog/2022/05/04/switch-to-java-11/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. Switching to Java 11/17 May 4, 2022 by Vojtěch Jurnek community news 你可…

腾讯云4核8G服务器性能如何?支持多少用户访问?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…

VSTO打包Word插件WPS也支持

启动AdvancedInstallerPortable.exe打包软件 选择“加载项” 选择“office加载项”之后点“创建项目” 四、输入自已的插件名和公司名 任选一种包类型 五、选择包的保存位置 勾选“vsto office加载项” 六、选择要打包的项目debug文件夹 选择相应版本 配置相应环境 选择语言 添…

Linux基础-配置网络

Linux配置网络的方式 1.图形界面 右上角-wired-配置 点加号-新建网络配置文件2.NetworkManager工具 2.1用图形终端nmtui 1.新建网络配置文件add 1.指定网络设备的类型Ethernet 2.配置网络配置文件的名称&#xff0c;名称可以有空格 3.配置网络配置文件对应的物理网络设备的…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Blank组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Blank组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Blank组件 空白填充组件&#xff0c;在容器主轴方向上&#xff0c;空白填充组件具…

sklearn中一些简单机器学习算法的使用

目录 前言 KNN算法 决策树算法 朴素贝叶斯算法 岭回归算法 线性优化算法 前言 本篇文章会介绍一些sklearn库中简单的机器学习算法如何使用&#xff0c;一些注释已经写在代码中&#xff0c;帮助一些小伙伴入门sklearn库的使用。 注意&#xff1a;本篇文章只涉及到如何使用…

Openwifi 开源项目解读(一)

Openwifi 是一个关于wifi 系统的开源项目&#xff0c;是一个少有的优秀的关于wifi的开源项目&#xff0c;项目中包括了wifi的基带、lowmac、linux驱动 等三部分&#xff0c;其中基带、lowmac部分是在FPGA中实现&#xff0c;wifi驱动部分是运行在Linux下&#xff0c;因此openwif…

失去中国市场的三星仍是全球第一,但中国手机无法失去海外市场

随着2023年分析机构公布全球手机市场和中国手机市场的数据&#xff0c;业界终于看清中国市场早已没有以前那么重要&#xff0c;三星、苹果这些国际品牌对中国市场的依赖没有他们想象的那么严重&#xff0c;相反中国手机对海外市场比以往任何时候都要更依赖了。 三星在2023年被苹…

【matalab】基于Octave的信号处理与滤波分析案例

一、基于Octave的信号处理与滤波分析案例 GNU Octave是一款开源软件&#xff0c;类似于MATLAB&#xff0c;广泛用于数值计算和信号处理。 一个简单的信号处理与滤波分析案例&#xff0c;说明如何在Octave中生成一个有噪声的信号&#xff0c;并设计一个滤波器来去除噪声。 首…

【数学建模】【2024年】【第40届】【MCM/ICM】【C题 网球运动中的“动量”】【解题思路】

一、题目 &#xff08;一&#xff09; 赛题原文 2024 MCM Problem C: Momentum in Tennis In the 2023 Wimbledon Gentlemen’s final, 20-year-old Spanish rising star Carlos Alcaraz defeated 36-year-old Novak Djokovic. The loss was Djokovic’s first at Wimbledon…

react函数组件中使用context

效果 1.在父组件中创建一个createcontext并将他导出 import React, { createContext } from react import Bpp from ./Bpp import Cpp from ./Cpp export let MyContext createContext(我是组件B) export let Ccontext createContext(我是组件C)export default function App…

Linux操作系统基础(五):Linux的目录结构

文章目录 Linux的目录结构 一、Linux目录与Windows目录区别 二、常见目录介绍&#xff08;记住重点&#xff09; Linux的目录结构 一、Linux目录与Windows目录区别 Linux的目录结构是一个树型结构 Windows 系统 可以拥有多个盘符, 如 C盘、D盘、E盘 Linux 没有盘符 这个概…