矩阵中不断增长的子串的长度
Posted
技术标签:
【中文标题】矩阵中不断增长的子串的长度【英文标题】:Length of a growing substring in matrix 【发布时间】:2022-01-14 16:25:22 【问题描述】:例如,给定一个方阵,找出正在增长的子字符串的长度。
matrix | result because of
5 |
1 2 3 4 5 |
2 5 2 5 9 |
7 8 9 0 1 --> 5 --> 1 2 3 4 5
0 0 0 0 0 |
2 3 6 1 2 |
我尝试将a[i][j]
与a[i][j+1]
进行比较并增加计数器,但我认为我的问题是当程序在最终元素上并且它不增加计数器时。
这里有我的代码:
int main()
int n;
scanf("%d",&n);
int i,j,a[n][n];
for(i = 0;i < n;i++)
for(j = 0;j <n;j++)
scanf("%d",&a[i][j]);
int max=-9999;
int counter;
for(i = 0;i < n;i++)
counter=0;
for(j = 0;j <n;j++)
if(a[i][j]<a[i][j+1])
counter++;
if(counter>max)
max = counter;
printf("%d",max);
return 0;
【问题讨论】:
当j
达到最大值时(n - 1
),表达式a[i][j+1]
调用Undefined Behaviour,因为元素a[i][n]
不存在(a[i]
从索引0
到n - 1
)。
它是方阵有什么意义?它可以“展平”为一个简单的一维数组。
@EugeneSh。这是作业问题,它特别告诉我们应该使用矩阵
最长增长的子串可以跨越多行吗?它总是在水平方向吗?这个问题似乎没有明确说明。
@ggolen 只是水平的并排成一行
【参考方案1】:
对于初学者来说,索引范围不能为负数,因此将变量 max 声明为负值是没有意义的
int max=-9999;
至少可以像这样初始化
int max = 0;
在这个if语句中
if(a[i][j]<a[i][j+1])
由于表达式a[i][j+1]
,当i
和j
等于n - 1
时,可以访问分配的数组之外的内存。
还有这个 if 语句
if(counter>max)
max = counter;
应该移到内部 if 语句之外。
并且变量count应该在外循环中声明
您可以通过以下方式重写内部 for 循环
int counter=1;
for(j = 1;j <n;j++)
if(a[i][j-1]<a[i][j])
counter++;
if(counter>max)
max = counter;
【讨论】:
你能解释一下为什么 counter 和 j 从 1 开始吗? @itmemilan 包含一个元素的序列是具有一个元素的增长序列。:)以上是关于矩阵中不断增长的子串的长度的主要内容,如果未能解决你的问题,请参考以下文章