螺旋矩陣

_Meriellan發表於2024-09-03

題目:螺旋矩陣
分類:陣列、矩陣、模擬
給你一個 m 行 n 列的矩陣 matrix ,請按照 順時針螺旋順序 ,返回矩陣中的所有元素。
示例 1:
輸入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
輸出:[1,2,3,6,9,8,7,4,5]
示例 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]
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100

路徑範圍
往右走最大值right
往左走最小值left
往下走最大值bottom
往上走最小值top
【細節】right是的最大值,bottom是的最大值

思路

  • 起點——向右——到right,right不變,top+1(往下走一行)——向下——到bottom,bottom不變,right-1(向左走一列)——向左——到left,left不變,bottom-1(向上走一行)——向上——到top,top不變,left+1(向右走一行,此時已在第二排第二列了)完成一週

  • 繼續螺旋迴圈,直到left>right,top<bottom退出,實則在二者相等時:僅剩一個元素,迴圈這一遍之後結束

【細節】

  1. 矩陣為空的處理
  2. 每次走都有兩個條件,eg:即使top現在不變,也要保證top<=bottom的前提,否則會越界
  3. java中用.length獲取大小,c++中用.size()
/*java*/
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> output = new ArrayList<>();
    //std::vector<int> spiralOrder(std::vector<std::vector<int>>& matrix) {
    //std::vector<int> output;
    if(matrix==null||matrix.length==0||matrix[0].length==0)
        return output;

        int left=0;
        int top=0;
        int bottom=matrix.length-1;
        int right=matrix[0].length-1;

        int i=0;
        while(left<=right && top<=bottom){
            for(i=left;i<=right&&top<=bottom;++i){
                output.add(matrix[top][i]);
            }
            top++;
            for(i=top;i<=bottom&&left<=right;++i){
                output.add(matrix[i][right]);
            }
            right--;
            for(i=right;i>=left&&top<=bottom;--i){
                output.add(matrix[bottom][i]);
            }
            bottom--;
            for(i=bottom;i>=top&&left<=right;--i){
                output.add(matrix[i][left]);
            }
            left++;
        }
        return output;
    }
};

相關文章