第一次想這題時方向不太對
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
//index[m] 走0~n.length-1格
//index[m+1] 走 最後(n-1)
//index[m+2] 走 n-1~ 0
//回到index[m+1]走 0~n-2
int m=matrix.length;
int n=matrix[0].length;
int i=0;
int r_index=0;
List<Integer> result= new ArrayList<Integer>();
while(i<m){//>字型走法
if(i==0){//第一列
int j=0;
while(j<n){
result.add(matrix[i][j++]);
}
}else if(i==m-1){//最後一列
int j=n-1;
while(j>=0){
result.add(matrix[i][j--]);
}
}else{//中間先走每一個matrix[i]最後一個index
result.add(matrix[i][n-1]);
}
i++;
r_index++;
}
//走中間每一個matrix[i]第一個index
i=0;
while(i<m&&m>2){
if(i!=0&&i!=m-1){
result.add(matrix[i][0]);
}
i++;
}
//....裡面的就要在循環一次>
return result;
}
}
解答
public class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> res = new ArrayList<Integer>();
if (matrix.length == 0) {
return res;
}
int rowBegin = 0;
int rowEnd = matrix.length-1;
int colBegin = 0;
int colEnd = matrix[0].length - 1;
while (rowBegin <= rowEnd && colBegin <= colEnd) {
// Traverse Right
for (int j = colBegin; j <= colEnd; j ++) {
res.add(matrix[rowBegin][j]);//[0][1],[0][2],[0][3]
}
rowBegin++;
// Traverse Down
for (int j = rowBegin; j <= rowEnd; j ++) {
res.add(matrix[j][colEnd]);//[1][2],[2][2]
}
colEnd--;
if (rowBegin <= rowEnd) {
// Traverse Left
for (int j = colEnd; j >= colBegin; j --) {
res.add(matrix[rowEnd][j]);//[2][1],[2][0]
}
}
rowEnd--;
if (colBegin <= colEnd) {
// Traver Up
for (int j = rowEnd; j >= rowBegin; j --) {
res.add(matrix[j][colBegin]);//[1][0]
}
}
colBegin ++;
}
return res;
}
}
留言列表