题目:螺旋矩阵
难度:Medium
题目内容:
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
翻译:
给定一个m x n元素的矩阵(m行,n列),以顺时针螺旋顺序返回矩阵的所有元素。
Example 1:
Input: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] Output: [1,2,3,6,9,8,7,4,5]
Example 2:
Input: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ] Output: [1,2,3,4,8,12,11,10,9,5,6,7]
我的思路:因为每一圈都是由四条边组成的,所以写一个while死循环,里面有四个for循环,每个for循环结束之后都将相应的指标减少,同时判断是否超标,超标就退出。
eg:
while (true) {
// 横着 for add
// top ++
// top 是否小于bottom 是则break
。。。
}
我的代码:
1 public List<Integer> spiralOrder(int[][] matrix) { 2 List<Integer> res = new ArrayList<Integer>(); 3 if(matrix.length == 0 || matrix[0].length == 0) return res; 4 5 int top = 0; 6 int bottom = matrix.length-1; 7 int left = 0; 8 int right = matrix[0].length-1; 9 10 while(true){ 11 for(int i = left; i <= right; i++) res.add(matrix[top][i]); 12 top++; 13 if(left > right || top > bottom) break; 14 15 for(int i = top; i <= bottom; i++) res.add(matrix[i][right]); 16 right--; 17 if(left > right || top > bottom) break; 18 19 for(int i = right; i >= left; i--) res.add(matrix[bottom][i]); 20 bottom--; 21 if(left > right || top > bottom) break; 22 23 for(int i = bottom; i >= top; i--) res.add(matrix[i][left]); 24 left++; 25 if(left > right || top > bottom) break; 26 } 27 28 return res; 29 }
我的复杂度:O(N * M) 行乘以列
编码过程中的问题:
1、没有注意到当输入为空的数组的时候 right 和bottom都会取成负数,所以得加上判空。
答案代码:
和我一样的。