给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/spiral-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路及方法
就硬解,就按这个螺旋思路,顺时针加行列。说下代码部分地方:
if (m == 0 || n == 0) {
break;
}
上面这里是因为有个例子过不去,超限,如{{1},{2},{3},{4},{5},{6},{7},{8},{9}},所以增加判断,当m或者n减到0的时候,就不用再循环了,已经螺旋完了。
List<Integer> new_list = new ArrayList<>();
for (int i = 0; i < sum; i++) {
new_list.add(list.get(i));
}
return new_list;
上面这里是因为按我的方法解出来,遇见示例二以及类似的情况,都会多加几个数字,如果没有上面代码,示例二输出:[1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7, 6],多了一个6。
如果数组为:{{1,2,3,4,5,6,7},{8,9,10,11,12,13,14},{15,16,17,18,19,20,21},{22,23,24,25,26,27,28},{29,30,31,32,33,34,35}},
输出为:[1, 2, 3, 4, 5, 6, 7, 14, 21, 28, 35, 34, 33, 32, 31, 30, 29, 22, 15, 8, 9, 10, 11, 12, 13, 20, 27, 26, 25, 24, 23, 16, 17, 18, 19, 18, 17],多了17,18。
我也不知道怎么解决,所以就用了笨办法,因为前面的顺序都是对,我只用输出前面正确的序列就行了,所以就有了以上代码。
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> list = new ArrayList<>();
int m = matrix.length;
int n = matrix[0].length;
int sum = m * n;
for (int i = 0; i < m; i++) {
// 加上行
for (int j = i; j < n; j++) {
list.add(matrix[i][j]);
}
// 加右列
for (int k = i + 1; k < m; k++) {
list.add(matrix[k][n - 1]);
}
// 加下行
for (int r = n - 2; r >= i; r--) {
list.add(matrix[m - 1][r]);
}
// 加左列
for (int s = m - 2; s >= i + 1; s--) {
list.add(matrix[s][i]);
}
m--;
n--;
if (m == 0 || n == 0) {
break;
}
}
List<Integer> new_list = new ArrayList<>();
for (int i = 0; i < sum; i++) {
new_list.add(list.get(i));
}
return new_list;
}
}
结果如下:
没想到还不错,嘻嘻。