LeetCode -- SpiralOrder
題目描述:
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
For example,
Given the following matrix:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
You should return [1,2,3,6,9,8,7,4,5].
從例子可以看出,需要做的是從矩陣的第一個元素為起始,沿外環向內依次遍歷,最後打印出結果。
思路:
獲取矩陣的長寬,設需要走n圈,則n = Min(寬度,高度)/2。
從左上節點為起始開始遍歷,走到最右的最後一個元素開始向下走,走到最後向左走,最後向上走。走了一圈,需要把坐標往內+1。
需要考慮剛好處於矩陣中間線的情況。
實現代碼:
public class Solution {
public IList SpiralOrder(int[,] matrix) {
if(matrix == null){
return new List();
}
var result = new List();
var rowLen = matrix.GetLength(0);
var len = matrix.GetLength(1);
if(rowLen == 1){
for(var i =0 ;i < len; i++){
result.Add(matrix[0,i]);
}
return result;
}
if(len == 1){
for(var i =0 ;i < rowLen; i++){
result.Add(matrix[i,0]);
}
return result;
}
var minLen = Math.Min(rowLen,len);
var cycleCount = minLen % 2 == 0 ? minLen/2 : (minLen + 1) / 2;
var c = 0;
for(var i = 0;i < cycleCount; i++){
if(c == len-c-1){
for(var k = c;k < rowLen - c; k++){
result.Add(matrix[k, c]);
}
c++;
continue;
}
// stick row to top, column : [c,len-c-1]
for(var top = c; top < len-c - 1; top++){
result.Add(matrix[c,top]);
}
// stick column to right, row : [c,rowLen-c-1]
for(var right = c; right < rowLen-c - 1; right ++){
result.Add(matrix[right, len-c-1]);
}
// stick row to bottom, column : [len-c-1, c]
for(var down = len-c -1; down > c; down --){
result.Add(matrix[rowLen-c-1, down]);
}
// stick column to left, row : [len-c-1, c]
for(var left = rowLen-c - 1; left > c; left --){
result.Add(matrix[left, c]);
}
c++;
}
return result;
}
}