《九日集訓》第十五輪 (第八講) 二級指標
阿新 • • 發佈:2022-04-05
知識點
二級指標
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
分析
模擬+列舉一下
程式碼
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
分析
開一個新陣列,然後把行列索引互換一下賦值
程式碼
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
分析
遍歷,當原列數大於新列數的時候,讓新列數的索引為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
分析
原理同上題
程式碼
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
分析
把二維陣列變成一維陣列向右移動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
分析
直接列舉格子周圍的格子數和格子數之和就行了
答案
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
分析
二維字首和,有模板,列舉\(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
分析
這題明顯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