《九日集训》第十五轮 (第八讲) 二级指针

知识点

二级指针

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. 矩阵区域和

分析

二维前缀和,有模板,枚举x1y1x2y2的范围即可。

模板:

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
image

本文作者:灰之魔女伊蕾娜

本文链接:https://www.cnblogs.com/daohengdao/p/16100959.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   灰之魔女伊蕾娜  阅读(19)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开