iT邦幫忙

2021 iThome 鐵人賽

DAY 4
0
AI & Data

想到甚麼打甚麼系列 第 4

找LeetCode上簡單的題目來撐過30天啦(DAY4)

明天要出去玩~應該吧/images/emoticon/emoticon07.gif
今天把前幾天放棄的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啦,好啦,我要去念別的證照了,大家晚安


上一篇
找LeetCode上簡單的題目來撐過30天啦(DAY3)
下一篇
找LeetCode上簡單的題目來撐過30天啦(DAY5)
系列文
想到甚麼打甚麼30

尚未有邦友留言

立即登入留言