867. 转置矩阵
867. 转置矩阵
给你一个二维整数数组 matrix, 返回 matrix 的 转置矩阵 。
矩阵的 转置 是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。
解题思路
直接进行交换赋值就好了。需要注意的是因为行列可能不同所以需要新申请空间。
int** transpose(int** matrix, int matrixSize, int* matrixColSize, int* returnSize, int** returnColumnSizes){ int m = matrixSize,n = *matrixColSize; int **ans = malloc(sizeof(int *) * n); *returnSize = n; *returnColumnSizes = malloc(sizeof(int) * (*returnSize)); for(int i = 0; i < *matrixColSize; ++i){ ans[i] = malloc(sizeof(int) * m); (*returnColumnSizes)[i] = matrixSize; } for(int i = 0; i < matrixSize; ++i) for(int j = 0;j < *matrixColSize; ++j) ans[j][i] = matrix[i][j]; return ans; }
2022. 将一维数组转变成二维数组
2022. 将一维数组转变成二维数组
给你一个下标从 0 开始的一维整数数组 original 和两个整数 m 和 n 。你需要使用 original 中 所有 元素创建一个 m 行 n 列的二维数组。
original 中下标从 0 到 n - 1 (都 包含 )的元素构成二维数组的第一行,下标从 n 到 2 * n - 1 (都 包含 )的元素构成二维数组的第二行,依此类推。
请你根据上述过程返回一个 m x n 的二维数组。如果无法构成这样的二维数组,请你返回一个空的二维数组。
解题思路
如果一开始达不到就直接返回空,然后一点点开始赋值就好了。
int** construct2DArray(int* original, int originalSize, int m, int n, int* returnSize, int** returnColumnSizes){ if(originalSize != m*n ){ *returnSize = 0; return NULL; } int ** ans = malloc(sizeof(int *) * m); *returnSize = m; *returnColumnSizes = malloc(sizeof(int) * m); for(int i = 0; i < m; ++i){ ans[i] = malloc(sizeof(int) *n); (*returnColumnSizes)[i] = n; } for(int i = 0;i < m; ++i) for(int j = 0; j < n; ++j) ans[i][j] = original[i*n + j]; return ans; }
1886. 判断矩阵经轮转后是否一致
1886. 判断矩阵经轮转后是否一致
给你两个大小为 n x n 的二进制矩阵 mat 和 target 。现 以 90 度顺时针轮转 矩阵 mat 中的元素 若干次 ,如果能够使 mat 与 target 一致,返回 true ;否则,返回 false 。
解题思路
旋转判断就好了。判断转一圈(4次)是否能重合
bool findRotation(int** mat, int matSize, int* matColSize, int** target, int targetSize, int* targetColSize){ if(targetSize != matSize || *targetColSize != *matColSize) return false; int n = 4; bool flag = true; while(n--){ flag = true; //旋转矩阵 //转置矩阵 for(int i = 0;i < matSize; ++i) for(int j = i + 1; j < matColSize[i]; j++){ mat[i][j] = mat[i][j] ^ mat[j][i]; mat[j][i] = mat[i][j] ^ mat[j][i]; mat[i][j] = mat[i][j] ^ mat[j][i]; } //垂直翻转 for(int i = 0;i < matSize; ++i) for(int j = 0; j < *matColSize / 2; j++){ mat[i][j] = mat[i][j] ^ mat[i][ *matColSize - 1 -j]; mat[i][*matColSize - 1 -j] = mat[i][j] ^ mat[i][ *matColSize - 1 -j]; mat[i][j] = mat[i][j] ^ mat[i][ *matColSize - 1 -j]; } for(int i = 0;i < matSize; ++i) for(int j = 0; j < matColSize[i]; j++) if(mat[i][j] != target[i][j]) flag = false; if(flag) return true; } return false; }
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; }
54. 螺旋矩阵
54. 螺旋矩阵
给你一个m行n列的矩阵matrix,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
解题思路
可以一圈一圈输出0.0
int* spiralOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize){ int *ans = malloc(sizeof(int) * 100),ansnum = 0; int top = 0, bottom = matrixSize - 1, left = 0, right = matrixColSize[0] - 1; while(top <= bottom && left <= right){ for(int i = left;i <= right;i++) ans[ansnum++] = matrix[top][i]; for(int i = top + 1;i <= bottom;i++) ans[ansnum++] = matrix[i][right]; if(bottom > top) for(int i = right - 1;i >= left;i--) ans[ansnum++] = matrix[bottom][i]; if(right > left) for(int i = bottom - 1; i >= top + 1;i--) ans[ansnum++] = matrix[i][left]; top++,left++; bottom--,right--; } *returnSize = ansnum; return ans; }