首頁 > 軟體

Java螺旋矩陣處理方法詳解

2022-10-02 14:01:35

題目描述:

給定一 m*n 的矩陣,請按照逆時針螺旋順序,返回矩陣中所有元素。

範例:

思路:

這是一道典型的模擬問題:

我們可以分析一下,遍歷前進軌跡: 向右 - > 向下 -> 向左 -> 向上 -> 向右 …

於是,我們可以在迴圈中模擬這樣的前進軌跡,記錄 右,下,上左,四個邊界,每次拐彎時更新邊界值,再進行下一次拐彎,迴圈往復,直至結束。結束條件為 左邊界加一大於右邊界,或者上邊界加一大於下邊界。

圖解:

程式碼:

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> list = new ArrayList<Integer>();
        // 思路: 注意上下左右邊界 —— 走格子法(一直走,一直走,直到走完了,出去)
        int left = 0;
        int right = matrix[0].length - 1;
        int up = 0;
        int down = matrix.length - 1;
        if(right==-1 || down==-1){
            return list;
        }
        while(true){
            // 向右走
            for(int i=left; i<=right; i++){
                list.add(matrix[up][i]);
            }
            // 判斷是否結束
            if(up+1 > down){
                break;
            } else{
                up++; // 更新上邊界
            }
            // 向下走
            for(int i=up; i<=down; i++){
                list.add(matrix[i][right]);
            }
            // 判斷是否結束
            if(right - 1 < left){
                break;
            } else{
                right--; // 更新右邊界
            }
            // 向左走
            for(int i=right; i>=left; i--){
                list.add(matrix[down][i]);
            }
            // 判斷是否結束
            if(down-1 < up){
                break;
            } else{
                down--; // 更新下邊界
            }
            // 向上走
            for(int i=down; i>=up; i--){
                list.add(matrix[i][left]);
            }
            // 判斷是否結束
            if(left + 1 > right ){
                break;
            } else{
                left++; // 更新左邊界
            }
        }
        return list;
    }
}

變式一: 題目描述:

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

範例:

程式碼:

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] ans = new int[n][n];
        int left = 0;
        int right = n - 1;
        int up = 0;
        int down = n - 1;
        int start = 1;
        while(true){
            // 向右
            for(int i=left; i<=right; i++){
                ans[up][i] = start;
                start++;
            }
            if(++ up > down){
                break;
            }
            // 向下
            for(int i=up; i<=down; i++){
                ans[i][right] = start;
                start++; 
            }
            if(-- right < left){
                break;
            }
            // 向左
            for(int i=right; i>=left; i--){
                ans[down][i] = start;
                start++;
            }
            if(-- down < up){
                break;
            }
            // 向上
            for(int i=down; i>=up; i--){
                ans[i][left] = start;
                start++;
            }
            if(++ left > right){
                break;
            }
        }
        return ans;
    }  
}

到此這篇關於Java螺旋矩陣處理方法詳解的文章就介紹到這了,更多相關Java螺旋矩陣內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com