目录
内容摘自英雄哥,以下是java版!
一、概念
矩阵的旋转、转置——《线性代数》
二、模板
对于n x m矩阵,进行水平翻转+反转图片
for(int i = 0; i < n; ++i) {
for(int j = 0; j < m; ++j) {
tar[i][j] = 1 - src[i][m-1-j];
}
}
三、例题
题:1672. 最富有客户的资产总量
解:
解题思路:枚举
AC代码:
class Solution {
public int maximumWealth(int[][] accounts) {
int max = 0;
for(int i = 0; i < accounts.length; i ++) {
int sum = 0;
for(int j = 0; j < accounts[i].length; j ++) {
sum += accounts[i][j];
}
max = Math.max(max, sum);
}
return max;
}
}
题:1582. 二进制矩阵中的特殊位置
给你一个大小为 rows x cols 的矩阵 mat,其中 mat[i][j] 是 0 或 1,请返回 矩阵 mat 中特殊位置的数目
。
特殊位置
定义:如果 mat[i][j] == 1 并且第 i 行和第 j 列中的所有其他元素均为 0(行和列的下标均 从 0 开始
),则位置 (i, j) 被称为特殊位置。
示例 1:
输入:mat = [[1,0,0],
[0,0,1],
[1,0,0]]
输出:1
解释:(1,2) 是一个特殊位置,因为 mat[1][2] == 1 且所处的行和列上所有其他元素都是 0
示例 2:
输入:mat = [[1,0,0],
[0,1,0],
[0,0,1]]
输出:3
解释:(0,0), (1,1) 和 (2,2) 都是特殊位置
示例 3:
输入:mat = [[0,0,0,1],
[1,0,0,0],
[0,1,1,0],
[0,0,0,0]]
输出:2
示例 4:
输入:mat = [[0,0,0,0,0],
[1,0,0,0,0],
[0,1,0,0,0],
[0,0,1,0,0],
[0,0,0,1,1]]
输出:3
提示:
rows == mat.length
cols == mat[i].length
1 <= rows, cols <= 100
mat[i][j] 是 0 或 1
解:
解题思路:先统计每行、列1的个数,再遍历
AC代码:
class Solution {
public int numSpecial(int[][] mat) {
// 统计每行、列1的个数
int[] rows = new int[mat.length];
int[] cols = new int[mat[0].length];
for(int i = 0; i < mat.length; i ++) {
for(int j = 0; j < mat[i].length; j ++) {
if(mat[i][j] == 1) {
rows[i] ++;
cols[j] ++;
}
}
}
// 遍历
int res = 0;
for(int i = 0; i < mat.length; i ++) {
for(int j = 0; j <mat[i].length; j ++) {
if(mat[i][j] == 1 && rows[i] == 1 && cols[j] == 1) res ++;
}
}
return res;
}
}
题:832. 翻转图像
给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果。
水平翻转图片就是将图片的每一行都进行翻转,即逆序。例如,水平翻转 [1, 1, 0] 的结果是 [0, 1, 1]。
反转图片的意思是图片中的 0 全部被 1 替换, 1 全部被 0 替换。例如,反转 [0, 1, 1] 的结果是 [1, 0, 0]。
示例 1:
输入:[[1,1,0],[1,0,1],[0,0,0]]
输出:[[1,0,0],[0,1,0],[1,1,1]]
解释:首先翻转每一行: [[0,1,1],[1,0,1],[0,0,0]];
然后反转图片: [[1,0,0],[0,1,0],[1,1,1]]
示例 2:
输入:[[1,1,0,0],[1,0,0,1],[0,1,1,1],[1,0,1,0]]
输出:[[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]
解释:首先翻转每一行: [[0,0,1,1],[1,0,0,1],[1,1,1,0],[0,1,0,1]];
然后反转图片: [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]
提示:
1 <= A.length = A[0].length <= 20
0 <= A[i][j] <= 1
解:
解题思路:双指针
+ 枚举优化
+ 位运算
AC代码:
class Solution {
public int[][] flipAndInvertImage(int[][] image) {
for(int i = 0; i < image.length; i ++) {
int j = 0, k = k = image[i].length - 1;
for(; j < k; j ++, k --) {
// 如果左右相同,则两边同时异或1
if(image[i][j] == image[i][k]) {
image[i][j] ^= 1;
image[i][k] ^= 1;
}
}
if(j == k) image[i][j] ^= 1;
}
return image;
}
}
题:48. 旋转图像
解:
解题思路:
AC代码: