LeetCode刷題-螺旋矩陣

前言說明

算法學(xué)習(xí),日常刷題記錄。

題目連接

螺旋矩陣

題目內(nèi)容

給你一個m行n列的矩陣matrix,請按照順時針螺旋順序,返回矩陣中的所有元素。

示例1:

輸入:matrix = [[1,2,3],[4,5,6],[7,8,9]]

輸出:[1,2,3,6,9,8,7,4,5]


矩陣1

示例2:

輸入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]

輸出:[1,2,3,4,8,12,11,10,9,5,6,7]


矩陣2

提示:

m == matrix.length

n == matrix[i].length

1 <= m, n <= 10

-100 <= matrix[i][j] <= 100

分析過程

第一步

定義列表list,保存返回的所有元素。

第二步

定義上指標(biāo)top,初始為0。

定義下指標(biāo)bottom,初始為行數(shù)減1。

定義左指標(biāo)left,初始為0。

定義右指標(biāo)right,初始為列數(shù)減1。

第三步

循環(huán),順時針螺旋也就是向右、向下、向左、向上移動,依次遍歷,直到?jīng)]有元素遍歷為止。

第四步

1、向右移動,行不變,列從左到右。

向右移動后,因為接下來要向下移動,所以上指標(biāo)top加1,如果上指標(biāo)top大于下指標(biāo)bottom,結(jié)束循環(huán)。

2、向下移動,列不變,行從上到下。

向下移動后,因為接下來要向左移動,所以右指標(biāo)right減1,如果右指標(biāo)right小于左指標(biāo)left,結(jié)束循環(huán)。

3、向左移動,行不變,列從右到左。

向左移動后,因為接下來要向上移動,所以下指標(biāo)bottom減1,如果下指標(biāo)bottom小于上指標(biāo)top,結(jié)束循環(huán)。

4、向上移動,列不變,行從下到上。

向上移動后,因為接下來要向右移動,所以左指標(biāo)left加1,如果左指標(biāo)left大于右指標(biāo)right,結(jié)束循環(huán)。

第五步

結(jié)束循環(huán)后,返回列表list。

解答代碼

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        // 定義列表list,保存返回的所有元素
        List<Integer> list = new ArrayList<>();

        // 定義上指標(biāo),初始為0
        int top = 0;
        // 定義下指標(biāo),初始為行數(shù)減1
        int bottom = matrix.length - 1;
        // 定義左指標(biāo),初始為0
        int left = 0;
        // 定義右指標(biāo),初始為列數(shù)減1
        int right = matrix[0].length - 1;

        // 循環(huán),順時針螺旋也就是向右、向下、向左、向上,依次遍歷,直到?jīng)]有元素遍歷為止
        while (true) {
            // 向右移動,行不變,列從左到右
            for (int i = left; i <= right; ++i) {
                list.add(matrix[top][i]);
            }

            // 向右移動后,因為接下來要向下移動,所以上指標(biāo)加1,如果上指標(biāo)大于下指標(biāo),結(jié)束循環(huán)
            if (++top > bottom) {
                break;
            }

            // 向下移動,列不變,行從上到下
            for (int i = top; i <= bottom; ++i) {
                list.add(matrix[i][right]);
            }

            // 向下移動后,因為接下來要向左移動,所以右指標(biāo)減1,如果右指標(biāo)小于左指標(biāo),結(jié)束循環(huán)
            if (--right < left) {
                break;
            } 

            // 向左移動,行不變,列從右到左
            for (int i = right; i >= left; --i) {
                list.add(matrix[bottom][i]);
            }

            // 向左移動后,因為接下來要向上移動,所以下指標(biāo)減1,如果下指標(biāo)小于上指標(biāo),結(jié)束循環(huán)
            if (--bottom < top) {
                break;
            } 

            // 向上移動,列不變,行從下到上
            for (int i = bottom; i >= top; --i) {
                list.add(matrix[i][left]);
            }

            // 向上移動后,因為接下來要向右移動,所以左指標(biāo)加1,如果左指標(biāo)大于右指標(biāo),結(jié)束循環(huán)
            if (++left > right) {
                break;
            } 
        }

        // 返回列表list
        return list;
    }
}

提交結(jié)果

執(zhí)行用時0ms,時間擊敗100.00%的用戶,內(nèi)存消耗36.5MB,空間擊敗72.30%的用戶。

運行結(jié)果

原文鏈接

原文鏈接:螺旋矩陣

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容