1.73. 矩阵置零
给定一个 m x n
的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
提示:
m == matrix.length
n == matrix[0].length
1 <= m, n <= 200
-2^31 <= matrix[i][j] <= 2^31 - 1
思路:
1)先遍历以便用集合来存0元素的行号与列号,再遍历对出现其中的元素进行清零。
2)关键思想: 用matrix第一行和第一列记录该行该列是否有0,作为标志位。但是对于第一行,和第一列要设置一个标志位,为了防止自己这一行(一列)也有0的情况.注释写在代码里,直接看代码很好理解!
代码:
第一个思路:
class Solution(object):def setZeroes(self, matrix):""":type matrix: List[List[int]]:rtype: None Do not return anything, modify matrix in-place instead."""hanghao=set()liehao=set()lieshu=len(matrix[0])for i in range(len(matrix)):for j in range(lieshu):if matrix[i][j]==0:hanghao.add(i)liehao.add(j)for i in range(len(matrix)):for j in range(lieshu):if i in hanghao or j in liehao:matrix[i][j]=0
第二个思路:
class Solution:def setZeroes(self, matrix: List[List[int]]) -> None:"""Do not return anything, modify matrix in-place instead."""row = len(matrix)col = len(matrix[0])row0_flag = Falsecol0_flag = False# 找第一行是否有0for j in range(col):if matrix[0][j] == 0:row0_flag = Truebreak# 第一列是否有0for i in range(row):if matrix[i][0] == 0:col0_flag = Truebreak# 把第一行或者第一列作为 标志位for i in range(1, row):for j in range(1, col):if matrix[i][j] == 0:matrix[i][0] = matrix[0][j] = 0#print(matrix)# 置0for i in range(1, row):for j in range(1, col):if matrix[i][0] == 0 or matrix[0][j] == 0:matrix[i][j] = 0if row0_flag:for j in range(col):matrix[0][j] = 0if col0_flag:for i in range(row):matrix[i][0] = 0
2.54. 螺旋矩阵
给你一个 m
行 n
列的矩阵 matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出:[1,2,3,4,8,12,11,10,9,5,6,7]提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100
思路:
主要就是模拟,关键在于设定上下左右边界。
- 取左边界到右边界,以upper为行,i为列从left到right 将上边界下移++upper
- 取上边界到下边界,以right为列,i为行从upper到down 将右边界左移--right
- 取右边界到左边界,以down为行,i为列从right到left 将下边界上移--down
- 取下边界到上边界,以left为列,i为行从down到upper 将左边界右移++left
代码:
class Solution {public List<Integer> spiralOrder(int[][] matrix) {int m=matrix.length , n=matrix[0].length;List<Integer> res=new ArrayList<>();int upper=0 , down=m-1 , left=0 , right=n-1;while(true){for(int i=left;i<=right;i++)res.add(matrix[upper][i]);if(++upper>down)break;for(int i=upper;i<=down;i++)res.add(matrix[i][right]);if(--right<left)break;for(int i=right;i>=left;i--)res.add(matrix[down][i]);if(--down<upper)break;for(int i = down;i>=upper;i--)res.add(matrix[i][left]);if(++left>right)break;}return res;}
}
3.48. 旋转图像
给定一个 n × n 的二维矩阵 matrix
表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[[7,4,1],[8,5,2],[9,6,3]]示例 2:
输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]] 输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]提示:
n == matrix.length == matrix[i].length
1 <= n <= 20
-1000 <= matrix[i][j] <= 1000