C++ 带状矩阵的二维映射

图片描述

第五题,每一行长度要怎么求?

回答:

题主是正在学算法吗哈哈哈qwq
答案中先默认行数列数都是从1开始编号,并称每个在带状区域中的位置为元素
第1行有a个元素,第二行就有a+1个元素,第三行就有a+2个元素

假设n足够大,那么第a行到了最长,有2a-1个元素,此时要保证n >= (2a-1)
反过来,最后一行,即第n行有a个元素,第n-1行有a+1个元素,这样反过来推就是第n-a+1行有最多元素2a-1个。
那么这个时候第a行到第n-a+1行都有最多的元素即2a-1个了

但要是n没那么大,从上往下推还没到第a行,第a行之前的某一行元素已经满了呢?
可以算出来,到了第n-a+1行时,每行所有位置都是元素了

详细一点:在一开始的时候,每一行都比上一行多一个元素,那么第1行有a个元素,假设第x行刚好开始有n个元素,那么第x行比第1行多(n-a)个元素,也就是第x行比第1行多了(n-a)行,当然就是n-a+1行了

然后反过来看,从下往上推到了第a行时,每行的所有元素也都是n个了
那么这时候也是第n-a+1到第a行有最多元素即n个了

我已经说得很清楚了吧,伪代码就不写了。时间复杂度是o(n)的,每次先判断
n和2a-1哪个大,假如前者大,那么给出第x行,如果x <= a 就是a+x-1个元素
如果 x >= a并且 x <= n - a + 1那么就是2a -1 个元素
否则就是 a + n - x个元素

以上是 C++ 带状矩阵的二维映射 的全部内容, 来源链接: utcz.com/p/192337.html

回到顶部