二维数组

1. 简介

二维数组是一种结构较为特殊的数组,只是将数组中的每个元素变成了一维数组。在这里插入图片描述
所以二维数组的本质上仍然是一个一维数组,内部的一维数组仍然从索引 0 开始,我们可以将它看作一个矩阵,并处理矩阵的相关问题。

类似一维数组,对于一个二维数组 A = [[1, 2, 3, 4],[2, 4, 5, 6],[1, 4, 6, 8]],计算机同样会在内存中申请一段 连续 的空间,并记录第一行数组的索引位置,即 A[0][0] 的内存地址,它的索引与内存地址的关系如下图所示。
在这里插入图片描述

2. 旋转矩阵

给定 matrix = [ [1,2,3], [4,5,6], [7,8,9] ],

原地旋转输入矩阵,使其变为: [ [7,4,1], [8,5,2], [9,6,3] ]

    void rotate(vector<vector<int>>& matrix) {
        if(matrix.empty()) return;
        vector<vector<int>> result;
        result = matrix;
        matrix.clear();
        int row = result.size();
        int col = result[0].size();
        cout << row << "  " << col << endl;
        for(int i=0; i<col; i++){
            vector<int> tmp;
            for(int j=row-1; j>=0; j--){
                tmp.push_back(result[j][i]);
            }
            matrix.push_back(tmp);
        }
    }

3. 零矩阵

输入: [ [1,1,1], [1,0,1], [1,1,1] ] 输出: [ [1,0,1], [0,0,0],
[1,0,1] ]

    void setZeroes(vector<vector<int>>& matrix) {
        if(matrix.empty()) return;
        int r = matrix.size();
        int c = matrix[0].size();
        vector<bool> row(r,false);
        vector<bool> col(c,false);

        //记录0元素的行和列
        for(int i=0; i<r; i++){
            for(int j=0; j<c; j++){
                if(matrix[i][j] == 0){
                    row[i] = true;
                    col[j] = true;
                }
            }
        }
        
        for(int i=0; i<r; i++){
            for(int j=0; j<c; j++){
                if(row[i]==true || col[j]==true){
                    matrix[i][j] = 0;
                }
            }
        }
    }
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页