LeetCode:Spiral Matrix - 螺旋輸出矩陣中的元素

一、題目名稱java

Spiral Matrix(螺旋輸出矩陣中的元素)code

二、題目地址element

https://leetcode.com/problems/spiral-matrix/leetcode

三、題目內容開發

英文:Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.get

中文:給出一個m行n列的矩陣,以螺旋順序返回矩陣中的全部元素。io

例如:現有矩陣以下:class

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

則輸出應爲 [1, 2, 3, 6, 9, 8, 7, 4, 5]import

四、解題方法1List

一種方法是使用四個數字分別記錄上下左右四個邊界的位置,不斷循環收窄這些邊界,最終當兩個邊界重疊時,結束循環。

Java代碼以下:

import java.util.LinkedList;
import java.util.List;

/**
 * @功能說明:LeetCode 54 - Spiral Matrix
 * @開發人員:Tsybius2014
 * @開發時間:2015年11月2日
 */
public class Solution {
    
    public List<Integer> spiralOrder(int[][] matrix) {

        LinkedList<Integer> linkedList = new LinkedList<Integer>();
        
        if (matrix == null || matrix.length == 0) {
            return linkedList;
        }
        
        //左右上下四個邊界
        int left = 0;
        int right = matrix[0].length - 1;
        int top = 0;
        int bottom = matrix.length - 1;

        int i;
        while (true) {
            
            //上邊,自左至右
            for (i = left; i <= right; i++) {
                linkedList.add(matrix[top][i]);
            }
            if (++top > bottom) {
                break;
            }
            
            //右邊,自上至下
            for (i = top; i <= bottom; i++) {
                linkedList.add(matrix[i][right]);
            }
            if (left > --right) {
                break;
            }
            
            //下邊,自右至左
            for (i = right; i >= left; i--) {
                linkedList.add(matrix[bottom][i]);
            }
            if (top > --bottom) {
                break;
            }
            
            //左邊,自下至上
            for (i = bottom; i >= top; i--) {
                linkedList.add(matrix[i][left]);
            }
            if (++left > right) {
                break;
            }
            
        }
        
        return linkedList;
    }
}

五、解題方法2

另外一種方法是預先指定好遍歷四個邊時的座標增減方向,並在每次沿一個方向行進完畢後,計算出下個方向應行進的單位數。

Java代碼以下:

import java.util.LinkedList;
import java.util.List;

/**
 * @功能說明:LeetCode 54 - Spiral Matrix
 * @開發人員:Tsybius2014
 * @開發時間:2015年11月2日
 */
public class Solution {
    
    public List<Integer> spiralOrder(int[][] matrix) {

        LinkedList<Integer> linkedList = new LinkedList<Integer>();
        
        if (matrix == null || matrix.length == 0) {
            return linkedList;
        }
        
        //行進方向
        int[][] direction = new int[][] {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
        
        //以初始點(0,0)的初始行進方向計算出的初始點前一個點的行列座標
        int x = 0;
        int y = -1;
        
        //矩陣的行數和列數
        int m = matrix.length;
        int n = matrix[0].length;
        
        //counter決定了轉動的具體方向
        int counter = 0;
        while (m > 0 && n > 0) {
            int k;
            //判斷橫向移動仍是縱向移動
            if (counter % 2 == 0) {
                k = n;
                m--;
            } else {
                k = m;
                n--;
            }
            //沿一個方向進行移動
            while (k-- != 0) {
                x += direction[counter][0];
                y += direction[counter][1];
                linkedList.add(matrix[x][y]);
            }
            //調整方向
            counter = (counter + 1) % 4;
        }
        
        return linkedList;
    }
}

END

相關文章
相關標籤/搜索