1. 程式人生 > 其它 >《九日集訓》第十五輪 (第八講) 二級指標

《九日集訓》第十五輪 (第八講) 二級指標

知識點

二級指標

int **myMalloc(int r, int c, int* returnSize, int** returnColumnSizes) {
    int i;
    int **ret = (int **)malloc( sizeof(int *) * r );        // (1)
    *returnColumnSizes = (int *)malloc( sizeof(int) * r );  // (2)
    *returnSize = r;                                        // (3)
    for(i = 0; i < r; ++i) {
        ret[i] = (int *)malloc( sizeof(int) * c );          // (4)
        (*returnColumnSizes)[i] = c;                        // (5)
    }    
    return ret;
}


題目分析

題目1

832. 翻轉影象

分析

模擬+列舉一下

程式碼

class Solution {
    void swap(int&a,int&b){
        int temp=0;
        temp=a;
        a=b;
        b=temp;
    }

    void reverse(vector<int>&nums){
        for(int i=0,j=nums.size()-1;i<j;i++,j--){
            swap(nums[i],nums[j]);
        }
    }
public:
    vector<vector<int>> flipAndInvertImage(vector<vector<int>>& image) {
        for(auto i=0;i<image.size();i++){
            reverse(image[i]);
            for(auto j=0;j<image[i].size();j++){
                image[i][j]=!image[i][j];
            }
            
        }

        return image;
    }
};

題目2

867. 轉置矩陣

分析

開一個新陣列,然後把行列索引互換一下賦值

程式碼

class Solution {
public:
    vector<vector<int>> transpose(vector<vector<int>>& matrix) {
        int m=matrix[0].size();//列
        int n=matrix.size();//行
        vector<vector<int>>res(m,vector<int>(n));
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++)
                res[i][j]=matrix[j][i];
        }
        return res;
    }
};

題目3

566. 重塑矩陣

分析

遍歷,當原列數大於新列數的時候,讓新列數的索引為0

程式碼

class Solution {
public:
    vector<vector<int>> matrixReshape(vector<vector<int>>& mat, int r, int c) {
        int m=mat.size();
        int n=mat[0].size();
        if(m*n!=r*c) return mat;

        vector<vector<int>> ans(r,vector<int>(c));
        for(int i=0,j=0,l=0;i<m;i++){
            for(int k=0;k<n;k++,l++){
                if(l>=c){
                    l=0;
                    j++;
                }
                ans[j][l]=mat[i][k];
            }
        }
        return ans;
    }
};

題目4

2022. 將一維陣列轉變成二維陣列

分析

原理同上題

程式碼

class Solution {
public:
    vector<vector<int>> construct2DArray(vector<int>& original, int m, int n) {
        if(m*n!=original.size())return{};
        vector<vector<int>> res(m,vector<int>(n));
        for(int i=0,j=0,k=0;i<original.size()&&j<m;i++,k++){
            if(k>=n){
                k=0;
                j++;
            }
            res[j][k]=original[i];
        }

        return res;
    }
};

題目5

1260. 二維網格遷移

分析

把二維陣列變成一維陣列向右移動k位,然後在變回二維陣列

程式碼

class Solution {
public:

    vector<vector<int>> shiftGrid(vector<vector<int>>& grid, int k) {
        int m=grid.size(),n=grid[0].size();
        vector<int>temp;
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
                temp.push_back(grid[i][j]);
                
        vector<int>temp2(temp.size());
        for(int i=0;i<temp.size();i++){
            temp2[(i+k)%temp.size()]=temp[i];
        }

        for(int i=0,j=0,k=0;i<temp.size()&&j<m;i++,k++){
            if(k>=n){
                k=0;
                j++;
            }
            grid[j][k]=temp2[i];
        }
        return grid;
    }
};

題目6

661. 圖片平滑器

分析

直接列舉格子周圍的格子數和格子數之和就行了

答案

class Solution {
public:
    vector<vector<int>> imageSmoother(vector<vector<int>>& img) {
        int m=img.size(),n=img[0].size();
        vector<vector<int>>res(m,vector<int>(n));
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++){
                int sum=0,cnt=0;
                for(int x=i-1;x<=i+1;x++)
                    for(int y=j-1;y<=j+1;y++)
                        if(x>=0&&y>=0&&x<m&&y<n){
                            cnt++;
                            sum+=img[x][y];
                        }
                res[i][j]=sum/cnt;
            }
        return res;
    }
};

題目7

1314. 矩陣區域和

分析

二維字首和,有模板,列舉\(x1,y1,x2,y2\)的範圍即可。

模板:

class Solution {
public:
    vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) {
        int m=mat.size(),n=mat[0].size();
        vector<vector<int>>sum(m+1,vector<int>(n+1));
        for(int i=1;i<=m;i++)
            for(int j=1;j<=n;j++)
                sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+mat[i-1][j-1];

        int sum;//x1,y1,x2,y2所圍成矩陣的區域和
        int x1,y1,x2,y2;
       	sum=sum[x2+1][y2+1]-sum[x1][y2+1]-sum[x2+1][y1]+sum[x1][y1];
        return res;
    }
};

程式碼

class Solution {
public:
    vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) {
        int m=mat.size(),n=mat[0].size();
        vector<vector<int>>sum(m+1,vector<int>(n+1));
        for(int i=1;i<=m;i++)
            for(int j=1;j<=n;j++)
                sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+mat[i-1][j-1];

        vector<vector<int>>res(m,vector<int>(n));
        int x1,y1,x2,y2;
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++){
                x1=i-k<0?0:i-k;
                y1=j-k<0?0:j-k;
                x2=i+k>=m?m-1:i+k;
                y2=j+k>=n?n-1:j+k;

                res[i][j]=sum[x2+1][y2+1]-sum[x1][y2+1]-sum[x2+1][y1]+sum[x1][y1];
            }
        return res;
    }
};

題目8

1030. 距離順序排列矩陣單元格

分析

這題明顯bfs,但是我不會,所以只能sort自定義排序氵一下了qwq

程式碼

class Solution {
public:
    vector<vector<int>> allCellsDistOrder(int rows, int cols, int rCenter, int cCenter) {
        vector<vector<int>>res;
        for(int i=0;i<rows;i++)
            for(int j=0;j<cols;j++){
                res.push_back({i,j});
            }

        sort(res.begin(),res.end(),[&rCenter,&cCenter](vector<int>&a,vector<int>&b){
            return (abs(a[0]-rCenter)+abs(a[1]-cCenter))<(abs(b[0]-rCenter)+abs(b[1]-cCenter));
        });

        return res;
    }
};

總結

今天的題比較簡單,除了那道要用BFS的題不會寫(以後補票),所以只能用sort自定義排序氵過去了qwq