明天要出去玩~應該吧
今天把前幾天放棄的Medium題目,撿回來解,一樣暴力解解決,那麼,廢話不多說,上菜囉
題號:54 標題:Spiral Matrix 難度:Medium
題目內容:
Given an m x n matrix, return all elements of the matrix in spiral order.
Example 1:
Input: matrix = [[1,2,3],[4,5,6],[7,8,9]]
Output: [1,2,3,6,9,8,7,4,5]
Example 2:
Input: matrix = [[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]
Constraints:
• m == matrix.length
• n == matrix[i].length
• 1 <= m, n <= 10
• -100 <= matrix[i][j] <= 100
我的程式碼
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
int i,j,x,y,count=0;
List<Integer> result = new ArrayList<>();
y = matrix.length;
x = matrix[0].length;
//System.out.println(x);
//System.out.println(y);
//System.out.println("1" + matrix[i][j]);
int ax=0,ay=0,bx=x-1,by=1,cx=x-2,cy=y-1,dx=0,dy=y-2;
while(count != (x*y)){
for(i=ax,j=ax;j<=bx;j++){
result.add(matrix[i][j]);
count++;
}
if(count == (x*y)){
break;
}
j=bx;
ay++;
ax++;
for(i=by;i<=cy;i++){
result.add(matrix[i][j]);
count++;
}
if(count == (x*y)){
break;
}
i=cy;
bx--;
by++;
for(j=cx;j>=dx;j--){
result.add(matrix[i][j]);
count++;
}
if(count == (x*y)){
break;
}
j=dx;
cy--;
cx--;
for(i=dy;i>=ax;i--){
result.add(matrix[i][j]);
count++;
}
if(count == (x*y)){
break;
}
dx++;
dy--;
}
return result;
}
}
邏輯
就是最直觀思考啦,把整個題目拆解成4個步驟,把左上、右上、右下、左下存成A(ax,ay)、B(bx,by)、C(cx,cy)、D(dx,dy)
步驟一(第一個for):固定i=ay,把j從ax到bx存起來,也就是→,然後把A往下一個位子移動。
步驟二(第二個for):固定j=bx,把i從by到cy存起來,也就是↓,然後把B往下一個位子移動。
步驟三(第三個for):固定i=cy,把j從cx到dx存起來,也就是←,然後把C往下一個位子移動。
步驟四(第四個for):固定j=dx,把i從dy到ax存起來,也就是↑,然後把D往下一個位子移動。
重複以上步驟直到存取的數量等於總數(也就是最外圈的while)
DAY4心得
總算解了Medium?但我好像沒用到甚麼複雜得計算或是技巧,程度依舊EASY啦,好啦,我要去念別的證照了,大家晚安