48. 旋转图像
题目:
思路:
【1】这道题的难点在于要知道旋转的规律与如何避免重复处理的问题
其中xc和yc分别为数组的边界值
xc = 数组行数 - 1 (因为正常下标是从0开始的,而长度统计是比边界值+1的)
yc = 数组列数 - 1
旋转90度
(x, y) -> (y, xc - x)
旋转180度
(x, y) -> (xc - x, xc - y)
旋转270度
(x, y) -> (yc - y, xc - x)
代码展示:
//时间0 ms 击败 100% //内存39.8 MB 击败 99.47% class Solution { public void rotate(int[][] matrix) { // 列数 int col = matrix[0].length; // 行数 int row = matrix.length; // 利用标记来记录是否对某个位置进行过处理 int[][] flag = new int[row][col]; // 全部置为没有变动过 for (int[] ints : flag) { Arrays.fill(ints, 0); } int tem; for (int i = 0; i < row; i++){ for (int j = 0; j < col; j++){ // 已经处理过了就不再处理 if (flag[i][j] == 1) continue; int oldCol = j; int oldRow = i; int oldValue = matrix[oldRow][oldCol]; boolean isRotate = true; while (isRotate){ int newCol = row - 1 - oldRow; int newRow = oldCol; tem = matrix[newRow][newCol]; matrix[newRow][newCol] = oldValue; oldValue = tem; oldRow = newRow; oldCol = newCol; // 如果已经转完一圈了应该结束循环 if (newRow == i && newCol == j){ isRotate = false; } //将该位置设置为处理过了 flag[newRow][newCol] = 1; } } } } } //时间0 ms 击败 100% //内存40 MB击败 95.96% //先将翻转的数据放于辅助空间再覆盖回原数组 class Solution { public void rotate(int[][] matrix) { int n = matrix.length; int[][] matrix_new = new int[n][n]; for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { matrix_new[j][n - i - 1] = matrix[i][j]; } } for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { matrix[i][j] = matrix_new[i][j]; } } } }
分类:
leetcode题目
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现