day 4-数组

1、重塑矩阵

  1. 描述

    在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。
    给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 r 和 c ,分别表示想要的重构的矩阵的行数和列数。
    重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。
    如果具有给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。
    
    示例 1:
    输入:mat = [[1,2],[3,4]], r = 1, c = 4
    输出:[[1,2,3,4]]
    示例 2:
    输入:mat = [[1,2],[3,4]], r = 2, c = 4
    输出:[[1,2],[3,4]]
    
  2. 思路

    判断总数是否相同

    遍历数组,逐个放入新数组

  3. 代码

    class Solution {
    public:
        vector<vector<int>> matrixReshape(vector<vector<int>>& mat, int r, int c) {
            cout << mat.size() << "  " << mat[0].size() << endl;
            if(mat.size() == 0 || mat[0].size() * mat.size() != r * c)  return mat;
            int num = 0;
            cout << num << "  " << c << endl;
            vector<vector<int>> res(r,vector<int>(c,0));
            for (int i = 0; i < (int) res.size(); ++i) {
                for (int j = 0; j < (int) res[i].size(); ++j) {
                    cout << res[i][j] << ",";
                }
                cout << endl;
            }
            cout << res.size() << "  " << res[0].size() << endl;
            cout << num / c << "  " << num % c << endl;
            cout << res[num / c][num % c] << endl;
            for(int i = 0; i < mat.size(); i++) {
                for(int j = 0; j < mat[0].size(); j++) {
                    printf("num: %d , res[%d][%d]: %d , mat[%d][%d]: %d\n",num,num/c,num%c,res[num/c][num%c],i,j,mat[i][j]);
                    res[num/c][num%c] = mat[i][j];
                    printf("num: %d , res[%d][%d]: %d , mat[%d][%d]: %d\n",num,num/c,num%c,res[num/c][num%c],i,j,mat[i][j]);
                    num++;
                }
            }
            return res;
        }
    };
    int main() {
        Solution sol;
        vector<vector<int>> mat = {{1,2,3,4}};
        int r = 2;
        int c = 2;
        sol.matrixReshape(mat, r, c);
        return 0;
    }
    

2、杨辉三角

  1. 描述

    给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
    
    在「杨辉三角」中,每个数是它左上方和右上方的数的和。 
    
    示例 1:
    输入: numRows = 5
    输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
    示例 2:
    输入: numRows = 1
    输出: [[1]]
    
  2. 思路

    遍历生成

  3. 代码

    #include <iostream>
    #include <vector>
    using namespace std;
    class Solution {
    public:
        vector<vector<int>> generate(int numRows) {
            vector<vector<int>> res;
            if(numRows >= 1)
                res.push_back(vector<int>(1,1));
            for(int i = 1; i < numRows; i++) {
                res.push_back(vector<int>(i + 1 ,0));
                for(int j = 0; j <= i; j++) {
                    if(j == 0)  res[i][j] = res[i-1][j];
                    else if(j == i)  res[i][j] = res[i-1][j-1];
                    else res[i][j] = res[i-1][j-1] + res[i-1][j];
                    printf("%d\t",res[i][j]);
                }
                printf("\n");
            }
            for(int i = 0; i < numRows; i++) {
                for(int j = 0; j <= i; j++) {
                    printf("%d\t",res[i][j]);
                }
                printf("\n");
            }
            return res;
        }
    };
    int main() {
        int num = 1;
        Solution sol;
        sol.generate(num);
        return 0;
    }
    
12-09 15:28