总结

1、范围求和II

2、螺旋遍历

3、对角线遍历

4、旋转数组中元素

算法:先对角交换(转置数组)。然后交换行元素

5、基础操作

1 构建

1.1 旋转数组

给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

链接:https://leetcode-cn.com/problems/spiral-matrix-ii/

算法:使用了2.2 螺旋遍历的逻辑。即包括:初始化数组和通过螺旋遍历为数组赋值。

1.2 杨辉三角

给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。

在杨辉三角中,每个数是它左上方和右上方的数的和。

链接:https://leetcode-cn.com/problems/pascals-triangle/

算法:

  • 每行元素个数等于行数。
  • 1的情况: 第一行和第二2行都是1,开始和结束元素都是1.

2 遍历

2.1 按行遍历

2.2  螺旋遍历

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

链接:https://leetcode-cn.com/problems/spiral-matrix/

算法:通过递归来实现。

  • 递归中止条件
  • 遍历中,防止重复遍历

2.3 对角线遍历

给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。

diagonal_traverse

链接:https://leetcode-cn.com/problems/diagonal-traverse/

算法:

  • 对角线的起点为第一行和最后一列的点
  • 对角线移动。a[i+1][j-1]
  • 奇数次翻转对角线结果。

img1

3 运算

3.1 图片平滑器(行遍历)

包含整数的二维矩阵 M 表示一个图片的灰度。你需要设计一个平滑器来让每一个单元的灰度成为平均灰度 (向下舍入) ,平均灰度的计算是周围的8个单元和它本身的值求平均,如果周围的单元格不足八个,则尽可能多的利用它们。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/image-smoother

算法:

  • 如何计算一个值的平均值。参考代码

 

3.2范围求和II

给定一个初始元素全部为 0,大小为 m*n 的矩阵 M 以及在 M 上的一系列更新操作。

操作用二维数组表示,其中的每个操作用一个含有两个正整数 a 和 b 的数组表示,含义是将所有符合 0 <= i < a 以及 0 <= j < b 的元素 M[i][j] 的值都增加 1。

在执行给定的一系列操作后,你需要返回矩阵中含有最大整数的元素个数。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/range-addition-ii

算法:

从这张图中,我们可以观察到最大元素会是两个操作对应矩阵的交集区域。我们还可以发现要求这块区域,我们不需要将操作区域一个一个加一,我们只需要记录交集区域的右下角即可。这个角的计算方法为: 获取ops中每一列的最小值。这样,最大元素的数目就是 x * y。

1

 

3.3 矩阵置为0

给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。

示例 1:

输入:
[
[1,1,1],
[1,0,1],
[1,1,1]
]
输出:
[
[1,0,1],
[0,0,0],
[1,0,1]
]

来源:力扣(LeetCode)
链接:http://:https://leetcode-cn.com/problems/set-matrix-zeroes
算法: 把0的元素都放置在首行和收列。mark的设置,需要考虑设置了0就不能被覆盖,1或者2都可以变为0

  • 首行为0的元素,就处理当前列。
  • 收列为0的,就处理当前行位0
  • 特殊处理第一个元素

代码:

4 数组移动

4.1 旋转数组

给定一个 n × n 的二维矩阵表示一个图像。

将图像顺时针旋转 90 度。

说明:

你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。

示例 1:

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rotate-image

算法:先对角交换(转置数组)。然后交换行元素

 

分类&标签