1260. 二维网格迁移
1260. 二维网格迁移
题目描述
给你一个 m 行 n 列的二维网格 grid 和一个整数 k。你需要将 grid 迁移 k 次。
每次「迁移」操作将会引发下述活动:
位于 grid[i][j] 的元素将会移动到 grid[i][j + 1]。
位于 grid[i][n - 1] 的元素将会移动到 grid[i + 1][0]。
位于 grid[m - 1][n - 1] 的元素将会移动到 grid[0][0]。
请你返回 k 次迁移操作后最终得到的 二维网格。
思路
按照要求一遍一遍的移动就好了。我觉得更好的方式是变成一维的形势,然后再移动后写回。
int** shiftGrid(int** grid, int gridSize, int* gridColSize, int k, int* returnSize, int** returnColumnSizes){ //处理返回值 int m = gridSize, n = *gridColSize,temp[m]; *returnSize = m; *returnColumnSizes = malloc(sizeof(int) * m); for(int i = 0; i< m; ++i) (*returnColumnSizes)[i] = n; while(k--){ //执行操作 for(int i = 0; i < m;++i){ temp[i] = grid[i][n - 1]; for(int j = n-1; j > 0; --j) grid[i][j] = grid[i][j -1]; } grid[0][0] = temp[m-1]; for(int i = 1; i < m;++i) grid[i][0] = temp[i-1]; } return grid; }
661. 图片平滑器
661. 图片平滑器
题目描述
包含整数的二维矩阵 M 表示一个图片的灰度。你需要设计一个平滑器来让每一个单元的灰度成为平均灰度 (向下舍入) ,平均灰度的计算是周围的8个单元和它本身的值求平均,如果周围的单元格不足八个,则尽可能多的利用它们。
思路
依次看周围的8个单元是否存在,然后进行计算平均数字就好了。
nt** imageSmoother(int** img, int imgSize, int* imgColSize, int* returnSize, int** returnColumnSizes){ if(imgSize == 0 || *imgColSize == 0){*returnSize = 0;return NULL;} //返回数组空间申请 int **ans = malloc(sizeof(int *) * imgSize); for(int i = 0;i < imgSize;i++) ans[i] = malloc(sizeof(int) * (*imgColSize)); (*returnColumnSizes) = malloc(sizeof(int) * imgSize); for(int i = 0;i < imgSize;i++) (*returnColumnSizes)[i] = *imgColSize; *returnSize = imgSize; //创建二维前缀和 int temp[imgSize][*imgColSize]; for(int i = 1;i < imgSize;) for(int i = 0;i < imgSize ;i++){ for(int j = 0;j < *imgColSize;j++){ int temp = img[i][j],tempnum = 1; if(i > 0) temp += img[i-1][j],tempnum++; if(j > 0) temp += img[i][j-1],tempnum++; if(i < imgSize - 1) temp += img[i+1][j],tempnum++; if(j < *imgColSize - 1) temp += img[i][j+1],tempnum++; if(i > 0 && j > 0) temp+=img[i-1][j-1],tempnum++; if(i > 0 && j < *imgColSize-1) temp += img[i-1][j+1],tempnum++; if(i < imgSize - 1 && j > 0) temp+=img[i+1][j-1],tempnum++; if(i < imgSize - 1 && j < *imgColSize - 1) temp+= img[i+1][j+1],tempnum++; ans[i][j] = temp/tempnum; } } return ans; }
1314. 矩阵区域和
1314. 矩阵区域和
题目描述
给你一个 m x n 的矩阵 mat 和一个整数 k ,请你返回一个矩阵 answer ,其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和:
i - k <= r <= i + k,
j - k <= c <= j + k 且
(r, c) 在矩阵内。
思路
这个可以使用一个叫做二维前缀和的东东,就是temp[i][j]表示从mat[0][0]到mat[i][j]这样一个矩阵的和。
int getnum(int (*temp)[100],int m,int n,int mmax,int nmax){ if(m < 0) m = -1; else if(m > mmax -1) m = mmax - 1; if(n < 0) n = -1; else if ( n > nmax -1) n = nmax -1; if(m < 0 || n < 0) return 0; else return temp[m][n]; } int** matrixBlockSum(int** mat, int matSize, int* matColSize, int k, int* returnSize, int** returnColumnSizes){ if(matSize == 0 || *matColSize == 0) {*returnSize = 0;return NULL;} //创建前缀和数组 int temp[matSize][100]; temp[0][0] = mat[0][0]; for(int i = 1;i < matSize;i++) temp[i][0] = temp[i - 1][0] + mat[i][0]; for(int i = 1;i < *matColSize;i++) temp[0][i] = temp[0][i - 1] + mat[0][i]; for(int i = 1;i < matSize;i++) for(int j = 1;j < *matColSize;j++) temp[i][j] = temp[i-1][j] + temp[i][j-1] - temp[i-1][j-1] + mat[i][j]; *returnSize = matSize; (*returnColumnSizes) = matColSize; //更新所有信息 for(int i = 0;i < matSize;i++) for(int j = 0;j < *matColSize ;j++) mat[i][j] = getnum(temp,i+k,j+k,matSize,*matColSize) + getnum(temp,i-k-1,j-k-1,matSize,*matColSize) - getnum(temp,i-k-1,j+k,matSize,*matColSize) - getnum(temp,i+k,j-k-1,matSize,*matColSize); return mat; }
1030. 距离顺序排列矩阵单元格
1030. 距离顺序排列矩阵单元格
题目描述
给出 R 行 C 列的矩阵,其中的单元格的整数坐标为 (r, c),满足 0 <= r < R 且 0 <= c < C。
另外,我们在该矩阵中给出了一个坐标为 (r0, c0) 的单元格。
返回矩阵中的所有单元格的坐标,并按到 (r0, c0) 的距离从最小到最大的顺序排,其中,两单元格(r1, c1) 和 (r2, c2) 之间的距离是曼哈顿距离,|r1 - r2| + |c1 - c2|。(你可以按任何满足此条件的顺序返回答案。)
思路
我就硬算,就从0到最大遍历添加到结果里。
int** allCellsDistOrder(int rows, int cols, int rCenter, int cCenter, int* returnSize, int** returnColumnSizes){ int** ans = malloc(sizeof(int*) * 10201),ansnum = 1; (*returnColumnSizes) = malloc(sizeof(int)*10201); for(int i = 0;i < 10201;i++){ ans[i] = malloc(sizeof(int)*2); (*returnColumnSizes)[i] = 2; } int temp = 1; ans[0][0] = rCenter,ans[0][1] = cCenter; while(ansnum < rows * cols){ for(int i = 0;i < temp;i++){ int k = temp - i; if(rCenter - k >=0 && cCenter - i >= 0){ans[ansnum][0] = rCenter - k;ans[ansnum++][1] = cCenter - i;} if(rCenter - i >= 0 && cCenter + k < cols){ans[ansnum][0] = rCenter - i;ans[ansnum++][1] = cCenter + k;} //printf("%d %d\n",i,k); if(rCenter + k < rows && cCenter + i < cols){ans[ansnum][0] = rCenter + k;ans[ansnum++][1] = cCenter + i;} if(rCenter + i < rows && cCenter - k >= 0){ans[ansnum][0] = rCenter + i;ans[ansnum++][1] = cCenter - k;} } temp++; //printf("%d ",ansnum); } *returnSize = ansnum; return ans; }