【小航的算法日记】矩阵

这篇博客详细介绍了矩阵的旋转、翻转和图像处理的算法,包括水平翻转、反转图像、矩阵旋转等操作,并通过AC代码展示了解决具体问题的实例,如最富有客户的资产总量、二进制矩阵中的特殊位置等。内容涵盖了基础的矩阵操作和算法思维,适合于提升编程和算法理解能力。
摘要由CSDN通过智能技术生成


内容摘自英雄哥,以下是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代码:


题:867. 转置矩阵

题:2022. 将一维数组转变成二维数组

题:1886. 判断矩阵经轮转后是否一致

题:1260. 二维网格迁移

题:54. 螺旋矩阵

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值