zoukankan      html  css  js  c++  java
  • Leetcode 566. Reshape the Matrix 矩阵变形(数组,模拟,矩阵操作)

    Leetcode 566. Reshape the Matrix 矩阵变形(数组,模拟,矩阵操作)

    题目描述

    在MATLAB中,reshape是一个非常有用的函数,它可以将矩阵变为另一种形状且保持数据不变。
    已知一个由二维数组表示的矩阵,和两个正整数r(行),c(列),将这个二维数组变换为r*c的矩阵。

    如果不能由原矩阵转换为r*c的矩阵就输出原矩阵,否则输出转换后的矩阵。

    测试样例

    Input:
    nums =
    [[1,2],
     [3,4]]
    r = 1, c = 4
    Output:
    [[1,2,3,4]]
    
    nums =
    [[1,2],
     [3,4]]
    r = 2, c = 4
    Output:
    [[1,2],
     [3,4]]
    Explanation:
    原2*2矩阵不能变换为2*4矩阵,所以原样输出。
    

    详细分析

    考虑将[[1,2],[3,4]]转换为1*4的[1,2,3,4]。
    首先我们需要两个循环,将原矩阵数据填入新矩阵

    for(int i=0;i<r;i++){
        for(int k=0;k<c;k++){
            ...
        }
    }
    

    这里的难点是坐标的变换。它们对照关系如下:

    newArr[0][0]=>oldArr[0][0]
    newArr[0][1]=>oldArr[0][1]
    newArr[0][3]=>oldArr[1][0]
    newArr[0][4]=>oldArr[1][1]
    

    这里我们考虑一种中间形式,先把新二维坐标转换为一维坐标,再将一维坐标转换为旧的二维坐标。比如,当我们填入newArr[0][3]时,它的一维坐标是0*c(新矩阵列数)+3,即3,然后3转化为旧的二维坐标就是old[3/原二维列数][3%原二维列数]

    代码实现

    class Solution {
    public:
        vector<vector<int>> matrixReshape(vector<vector<int>>& nums, int r, int c) {
            //corner case for empty 2-dimension array
            if(nums.size()==0){
                return nums;
            }
            if(nums[0].size()==0){
                return nums;
            }
            //illegal case
            if(nums.size()*nums[0].size()!=r*c){
                return nums;
            }
    
            std::vector<std::vector<int>> dv;
    
            for(int i=0;i<r;i++){
                std::vector<int> v;
                for(int k=0;k<c;k++){
                    int p=i*c+k;
                    int idx1=p/nums[0].size();
                    int idx2=p%nums[0].size();
    
                    v.push_back(nums[idx1][idx2]);
                }
                dv.push_back(v);
            }
            return dv;
    
        }
    };
    
  • 相关阅读:
    语句
    C#语言基础
    进制转换
    js对URL的相关操作集锦
    js/javascript计时器方法及使用场景
    js中FormData+XMLHttpRequest数据传输
    HTML中footer固定在页面底部的若干种方法
    js/jquery 禁用点击事件
    asp.net微信开发第七篇----高级群发(图文)
    asp.net微信开发第六篇----高级群发(文本)
  • 原文地址:https://www.cnblogs.com/ysherlock/p/8463301.html
Copyright © 2011-2022 走看看