原题链接
链接: 56.螺旋矩阵
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
力扣模式
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
if (matrix.length == 0) return new ArrayList<>();
int l = 0, r = matrix[0].length - 1, t = 0, b = matrix.length - 1, x = 0;
Integer[] res = new Integer[(r+1) * (b+1)];
while (true) {
for (int i = l; i <= r; i++) res[x++] = matrix[t][i];
if (++t > b) break;
for (int i = t; i <= b; i++) res[x++] = matrix[i][r];
if (--r < l) break;
for (int i = r; i >= l; i--) res[x++] = matrix[b][i];
if (--b < t) break;
for (int i = b; i >= t; i--) res[x++] = matrix[i][l];
if (++l > r) break;
}
return Arrays.asList(res);
}
}
ACM模式
package com;
import java.util.*;
/**
* @author QWFeng
* @version 1.0
*/
public class spiral_matrix {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt(), n = sc.nextInt();
int[][] matrix = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
matrix[i][j] = sc.nextInt();
}
}
List<Integer> res = func(matrix);
System.out.println(res);
}
private static List<Integer> func(int[][] matrix) {
if (matrix.length == 0) return new ArrayList<>();
int l = 0, r = matrix[0].length - 1, t = 0, b = matrix.length - 1, x = 0;
Integer[] res = new Integer[(r + 1) * (b + 1)];
while (true) {
for (int i = l; i <= r; i++) res[x++] = matrix[t][i];
if (++t > b) break;
for (int i = t; i <= b; i++) res[x++] = matrix[i][r];
if (--r < l) break;
for (int i = r; i >= l; i--) res[x++] = matrix[b][i];
if (--b < t) break;
for (int i = b; i >= t; i--) res[x++] = matrix[i][l];
if (++l > r) break;
}
return Arrays.asList(res);
}
}
总结
时间复杂度
O(mn) : m,n分别为矩阵行数和列数。
空间复杂度
o(1):l, r, t, t四个边界值使用常数大小的额外空间
区别
这道题的ACM模式的方法实现跟力扣模式完全一样,只是需要在main函数里处理输入输出即可。