1、73. 矩阵置零
给定一个 m x n
的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
示例 1:
输入:matrix = [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]
// 将第一行第一列作为标记位
class Solution {public void setZeroes(int[][] matrix) {int m = matrix.length,n = matrix[0].length;boolean mflag = false,nflag = false;// 记录标记位是否出现过0,因为此时不记录,后面若是被覆盖就不准了for(int i = 0;i < m;i++) {if(matrix[i][0] == 0) {mflag = true;break;}}for(int i = 0;i < n;i++) {if(matrix[0][i] == 0) {nflag = true;break;}}// 让标记位变零for(int i = 1;i < m;i++) {for(int j = 1;j < n;j++) {if(matrix[i][j] == 0) {// 将该元素所在行列的标记位设为零matrix[i][0] = matrix[0][j] = 0;}}}// 根据已修改过的标记位修改矩阵for(int i = 1;i < m;i++) {for(int j = 1;j < n;j++) {// 根据标记位,将对应行列除标记位外全部涂为0if(matrix[i][0] == 0 || matrix[0][j] == 0) {matrix[i][j] = 0;}}}// 根据之前记录的标记位进行涂改if(mflag) {for(int i = 0;i < m;i++) {matrix[i][0] = 0;}}if(nflag) {for(int i = 0;i < n;i++) {matrix[0][i] = 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]
// 一道考验边界判断的题
class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> ans = new ArrayList<>();if (matrix == null || matrix.length == 0) return ans;int top = 0, bottom = matrix.length - 1;int left = 0, right = matrix[0].length - 1;while (top <= bottom && left <= right) {// 1. 左上 → 右上for (int i = left; i <= right; i++) {ans.add(matrix[top][i]);}top++;// 2. 右上 → 右下for (int i = top; i <= bottom; i++) {ans.add(matrix[i][right]);}right--;// 检测是否还有空间放下新的元素// 3. 右下 → 左下 (需要检查是否还有行)if (top <= bottom) {for (int i = right; i >= left; i--) {ans.add(matrix[bottom][i]);}bottom--;}// 4. 左下 → 左上 (需要检查是否还有列)if (left <= right) {for (int i = bottom; i >= top; i--) {ans.add(matrix[i][left]);}left++;}}return ans;}
}
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]]
// 数学是很重要的工具 多看一些数学推论即可,也不需要多么深耕
class Solution {public void rotate(int[][] matrix) {int n = matrix.length;// 水平翻转for (int i = 0; i < n / 2; ++i) {for (int j = 0; j < n; ++j) {int temp = matrix[i][j];matrix[i][j] = matrix[n - i - 1][j];matrix[n - i - 1][j] = temp;}}// 主对角线翻转for (int i = 0; i < n; ++i) {for (int j = 0; j < i; ++j) {int temp = matrix[i][j];matrix[i][j] = matrix[j][i];matrix[j][i] = temp;}}}
}
4、240. 搜索二维矩阵 II
编写一个高效的算法来搜索 m x n
矩阵 matrix
中的一个目标值 target
。该矩阵具有以下特性:
- 每行的元素从左到右升序排列。
- 每列的元素从上到下升序排列。
示例 1:
输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5 输出:true
// 贪心算法的用处之一
class Solution {public boolean searchMatrix(int[][] matrix, int target) {int m = matrix.length, n = matrix[0].length;int x = 0, y = n - 1;while (x < m && y >= 0) {if (matrix[x][y] == target) {return true;}if (matrix[x][y] > target) {--y;} else {++x;}}return false;}
}