LeetCode---383周赛

题目列表

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.hqwc.cn/news/464322.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络编程项目:电子辞典

项目要求&#xff1a; 登录注册功能&#xff0c;不能重复登录&#xff0c;重复注册。用户信息也存储在数据库中。单词查询功能历史记录功能&#xff0c;存储单词&#xff0c;意思&#xff0c;以及查询时间&#xff0c;存储在数据库基于TCP&#xff0c;支持多客户端连接&#x…

力扣[面试题 01.02. 判定是否互为字符重排(哈希表,位图)

Problem: 面试题 01.02. 判定是否互为字符重排 文章目录 题目描述思路复杂度Code 题目描述 思路 思路1&#xff1a;哈希表 1.若两个字符串长度不相等&#xff0c;则一定不符合题意&#xff1b; 2.创建一个map集合&#xff0c;先将字符串s1中的每一个字符与其对应的数量存入集合…

利用YOLOv8 pose estimation 进行 人的 头部等马赛克

文章大纲 马赛克几种OpenCV 实现马赛克的方法高斯模糊pose estimation 定位并模糊:三角形的外接圆与膨胀系数实现实现代码实现效果参考文献与学习路径之前写过一个文章记录,怎么对人进行目标检测后打码,但是人脸识别有个问题是,很多人的背影,或者侧面无法识别出来人脸,那…

【leetcode热题100】 格雷编码

n 位格雷码序列 是一个由 2n 个整数组成的序列&#xff0c;其中&#xff1a; 每个整数都在范围 [0, 2n - 1] 内&#xff08;含 0 和 2n - 1&#xff09;第一个整数是 0一个整数在序列中出现 不超过一次每对 相邻 整数的二进制表示 恰好一位不同 &#xff0c;且第一个 和 最后一…

6 scala-面向对象编程基础

Scala 跟 Java 一样&#xff0c;是一门面向对象编程的语言&#xff0c;有类和对象的概念。 1 类与对象 与 Java 一样&#xff0c;Scala 也是通过关键字 class 来定义类&#xff0c;使用关键字 new 创建对象。 要运行我们编写的代码&#xff0c;同样像 Java 一样&#xff0c;…

【北邮鲁鹏老师计算机视觉课程笔记】01 introduction

1 生活中的计算机视觉 生活中的各种计算机视觉识别系统已经广泛地应用起来了。 2 计算机视觉与其他学科的关系 认知科学和神经科学是研究人类视觉系统的&#xff0c;如果能把人类视觉系统学习得更好&#xff0c;可以迁移到计算机视觉。是计算机视觉的理论基础。 算法、系统、框…

FPGA_工程_基于rom的vga显示

一 框图 二 代码修改 module Display #(parameter H_DISP 1280,parameter V_DISP 1024,parameter H_lcd 12d150,parameter V_lcd 12d150,parameter LCD_SIZE 15d10_000 ) ( input wire clk, input wire rst_n, input wire [11:0] lcd_xpos, //lcd horizontal coo…

C语言第二十二弹---指针(六)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 指针 1. 回调函数是什么&#xff1f; 2、qsort使用举例 2.1、使用qsort函数排序整型数据 2.2 使用qsort排序结构体数据 3、qsort函数的模拟实现 总结 1. 回…

从信息隐藏到功能隐藏

本文主要记录复旦大学张新鹏教授于2022年12月在第三届CSIG中国媒体取证与安全大会上的汇报

Windows10/11程序属性DPI设置(Dots Per Inch,每英寸点数)(属性-->兼容性-->更改高DPI设置)(Change high DPI settings)

文章目录 Windows程序DPI设置什么是DPIDPI和Windows应用程序DPI感知级别不感知DPI系统DPI感知每监视器DPI感知 设置DPI感知级别应用程序清单方式API方式 处理DPI变化 DPI缩放与图像资源自动缩放支持 Windows10/11应用程序属性中的DPI设置如何访问DPI设置DPI设置选项解释程序DPI…

YOLO系列详解(YOLOV1-YOLOV3)

YOLO算法 简介 本文主要介绍YOLO算法&#xff0c;包括YOLOv1、YOLOv2/YOLO9000和YOLOv3。YOLO算法作为one-stage目标检测算法最典型的代表&#xff0c;其基于深度神经网络进行对象的识别和定位&#xff0c;运行速度很快&#xff0c;可以用于实时系统。了解YOLO是对目标检测算…

微服务入门篇:http客户端Feign(远程调用,自定义配置,Feign的性能优化,Feign服务抽取)

目录 1.基于Feign的远程调用1.RestTemplate方式调用存在的问题2.Feign的介绍3.定义和使用Feign客户端 2.自定义配置1.方式一&#xff1a;配置文件方式2.方式二: java代码方式&#xff0c;需要先声明一个Bean: 3.Feign的性能优化1.Feign底层的客户端实现2.连接池配置 4.Feign的最…