以下是 LeetCode 48. 旋转图像 的 Java 实现,采用 转置 + 水平翻转 的方法,原地修改矩阵。
思路
- 转置:沿主对角线交换元素,matrix[i][j] 与 matrix[j][i] 互换(只遍历上三角即可)。
- 水平翻转:对每一行,将首尾元素依次交换,实现左右反转。
经过这两步,原矩阵即为顺时针旋转 90° 的结果。
代码
classSolution{publicvoidrotate(int[][]matrix){intn=matrix.length;// 1. 转置矩阵(沿主对角线翻转)for(inti=0;i<n;i++){for(intj=i+1;j<n;j++){inttemp=matrix[i][j];matrix[i][j]=matrix[j][i];matrix[j][i]=temp;}}// 2. 水平翻转每一行for(inti=0;i<n;i++){intleft=0,right=n-1;while(left<right){inttemp=matrix[i][left];matrix[i][left]=matrix[i][right];matrix[i][right]=temp;left++;right--;}}}}复杂度分析
· 时间复杂度:O(n²),需要遍历矩阵两次(转置和翻转各一次)。
· 空间复杂度:O(1),只使用了常数级额外空间。
说明
· 转置时从 j = i + 1 开始,跳过对角线,避免重复交换。
· 水平翻转时使用双指针,交换每一行的对称位置元素。
· 该解法是原地算法,符合题目要求。