java数据结构与算法刷题-----LeetCode566. 重塑矩阵

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

文章目录

    • 1. 法一,下标填充
    • 2. 法二:数学除法和取余

java数据结构与算法刷题-----LeetCode566. 重塑矩阵_第1张图片

1. 法一,下标填充

代码:时间复杂度O(r*c).除题目要求外,算法本身没有需要额外空间,空间复杂度O(1)

java数据结构与算法刷题-----LeetCode566. 重塑矩阵_第2张图片

class Solution {
    public int[][] matrixReshape(int[][] mat, int r, int c) {
        int matR = mat.length,matC = mat[0].length;//获取原矩阵的行和列数
        if(r*c != matR*matC) return mat;//如果不合理,直接返回原始矩阵
        int[][] ans = new int[r][c];//如果合理,创建需要重塑的矩阵容器
        int ansI = 0, ansJ = 0;//重塑矩阵专用的两个下标,代表行和列
        for(int i = 0;i<matR;i++){//依次遍历原矩阵元素,按行遍历
            for(int j = 0;j<matC;j++){//依次从左到右遍历原矩阵元素
                ans[ansI][ansJ] = mat[i][j];//将其放到重塑矩阵
                if(ansJ==c-1){//如果重塑矩阵当前行放满了
                    ansI++;//转到下一行
                    ansJ = 0;//转到第一列
                }else ansJ++;//如果重塑矩阵当前行没放满,去往当前行下一列(下一个位置放)
            }
        }
        return ans;
    }
}

2. 法二:数学除法和取余

java数据结构与算法刷题-----LeetCode566. 重塑矩阵_第3张图片

  1. 从0开始算,一个3列n行矩阵中,每行就有3个元素,我们从头开始数,第15个元素,在第几行?当然是15/3=5
  2. 知道是第5行,那么在第5行的第几列呢?当然是让它15%3 = 0; 也就是放在第0个位置,也就是[5][0]位置
  3. 如果我们将其放到4列n行矩阵中,每行有4个元素,从头开始算,第15个元素在第几行?当然是15/4 = 3
  4. 第几列呢?15%4 = 3. 也就是[3][3]位置
代码:时间复杂度O(r*c).除题目要求外,算法本身没有需要额外空间,空间复杂度O(1)

java数据结构与算法刷题-----LeetCode566. 重塑矩阵_第4张图片

class Solution {
    //从0开始算,一个3列n行矩阵中,每行就有3个元素,我们从头开始数,第15个元素,在第几行?当然是15/3=5
    //知道是第5行,那么在第5行的第几列呢?当然是让它15%3 = 0; 也就是放在第0个位置,也就是[5][0]位置
    //如果我们将其放到4列n行矩阵中,每行有4个元素,从头开始算,第15个元素在第几行?当然是15/4 = 3
    //第几列呢?15%4 = 3. 也就是[3][3]位置
    public int[][] matrixReshape(int[][] mat, int r, int c) {
        int matR = mat.length,matC = mat[0].length;//获取原矩阵的行和列数
        if(r*c != matR*matC) return mat;//如果不合理,直接返回原始矩阵
        int[][] ans = new int[r][c];//如果合理,创建需要重塑的矩阵容器
        //利用除法和取余,获取每个元素应该在的位置
        for(int i = 0; i< matR*matC;i++) ans[i/c][i%c] = mat[i/matC][i%matC];
        return ans;
    }
}

你可能感兴趣的:(算法,java,矩阵,算法,leetcode)