题目一描述:
给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。
例如,
给出以下矩阵:
[↵ [ 1, 2, 3 ],↵ [ 4, 5, 6 ],↵ [ 7, 8, 9 ]↵]
你应该返回[1,2,3,6,9,8,7,4,5]。
题目一分析:
相当于一个m x n的二维数组螺旋进行输出,边界条件可以分为三种:矩阵为空时,直接返回;行大于列时,列大于行时,单独循环打印多余的数。
代码如下:
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> spiralOrder(int[][] matrix) {
ArrayList<Integer> arrList = new ArrayList<Integer>();
//数组为空时返回空集合
if(matrix == null ||matrix.length==0) return arrList;
int left = 0;
int right = matrix[0].length-1;
int top = 0;
int bottom = matrix.length-1;
//旋转打印数组
while(left < right && top < bottom) {
for(int j = left;j <= right;j++)arrList.add(matrix[top][j]);
top++;
for(int i = top;i <= bottom;i++)arrList.add(matrix[i][right]);
right--;
for(int j = right;j >= left;j--)arrList.add(matrix[bottom][j]);
bottom--;
for(int i = bottom;i >= top;i--)arrList.add(matrix[i][left]);
left++;
}
//只剩余中间一列时,从上到下进行打印
if(left == right&& top <= bottom) for(int i=top;i<=bottom;i++) arrList.add(matrix[i][left]);
//只剩一行时,从左到右进行打印
if(top == bottom && left < right) for(int i=left;i<=right;i++) arrList.add(matrix[top][i]);
return arrList;
}
}
题目二描述:
给出一个用二维矩阵( n x n 2D matrix)表示的图像
返回该图像顺时针旋转90度的结果
扩展:
你能使用原地算法解决这个问题么?
题目二分析:
一个n*n的方针,使用原地算法对其进行旋转90度,因此需要同时指向矩阵的四个对应位置进行交换即可。
代码如下:
public class Solution {
public void rotate(int[][] matrix) {
//空数组无需旋转
if(matrix == null ||matrix.length==0) return ;
int left = 0;
int right = matrix[0].length-1;
int top = 0;
int bottom = matrix.length-1;
//循环替换四个位置的值
while(left < right && top < bottom) {
for(int j = left,i=right;j < right && i > left;j++,i--) {
int tmp =matrix[top][j];
matrix[top][j] = matrix[i][top];
matrix[i][top] = matrix[bottom][i];
matrix[bottom][i] = matrix[j][bottom];
matrix[j][bottom] = tmp;
}
left++;right--;top++;bottom--;
}
}
}