首页 > 其他 > 详细

重塑矩阵

时间:2021-02-17 23:58:34      阅读:41      评论:0      收藏:0      [点我收藏+]

题目概述

给出一个由二维数组表示的矩阵,以及两个正整数 r 和 c,分别表示想要的重构的矩阵的行数和列数

重构后的矩阵需要将原始矩阵的所有元素以相同的行遍历顺序填充

如果具有给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵

示例一如下:

输入: 
nums = [[1,2],[3,4]]
r = 1, c = 4
输出: 
[[1,2,3,4]]
解释:
行遍历 nums 的结果是 [1,2,3,4],新的矩阵是 1 * 4 矩阵,用之前的元素值一行一行填充新矩阵

示例二如下:

输入: 
nums = [[1,2],[3,4]]
r = 2, c = 4
输出: 
[[1,2],[3,4]]
解释:
没有办法将 2 * 2 矩阵转化为 2 * 4 矩阵。 所以输出原矩阵

解题思路

最简单的思路,遍历原数组,将元素放进新数组里边,设置两个标志位防止下标越界

class Solution {
    public int[][] matrixReshape(int[][] nums, int r, int c) {
        int row = nums.length;
        int col = nums[0].length;
        int eleCount = row * col;
        if(eleCount != r * c) {
            return nums;
        }
        int colFlag = 0;
        int rowFlag = 0;
        int[][] newNums = new int[r][c];
        for(int i = 0; i < row; i++) {
            for(int j = 0; j < col; j++) {
                if(colFlag == c) {
                    rowFlag++;
                    colFlag = 0;
                }
                newNums[rowFlag][colFlag] = nums[i][j];
                colFlag++;
            }
        }
        return newNums;
    }
}

另一种思路是按照下面的规则直接将元素映射到新数组中

  • 设 nums 为 m 行 n 列,x = m * n,我们可以将整数 x 映射回其在矩阵中的下标,即
    • i = x / n
    • j = x % n
class Solution {
    public int[][] matrixReshape(int[][] nums, int r, int c) {
        int m = nums.length;
        int n = nums[0].length;
        if (m * n != r * c) {
            return nums;
        }
        int[][] ans = new int[r][c];
        for (int x = 0; x < m * n; ++x) {
            ans[x / c][x % c] = nums[x / n][x % n];
        }
        return ans;
    }
}

重塑矩阵

原文:https://www.cnblogs.com/Yee-Q/p/14410089.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!