Leetcode刷題之螺旋矩陣
阿新 • • 發佈:2022-03-31
矩陣之螺旋矩陣
總體思路:
- 注意遍歷順序 每次遍歷一圈時候不要多加元素
Leetcode54螺旋矩陣
- 給你一個
m
行n
列的矩陣matrix
,請按照 順時針螺旋順序 ,返回矩陣中的所有元素。
public List<Integer> spiralOrder(int[][] matrix) { LinkedList<Integer> res=new LinkedList<>(); int num=matrix.length*matrix[0].length;//總元素個數 int top=0; int bottom=matrix.length-1; int left=0; int right=matrix[0].length-1; int offset=1;//偏移量 while(num>=1){ //從左到右 包括上面全部資料 for(int i=left;i<=right && num>=1;i++){ res.add(matrix[top][i]); num--; } //從上到下 最上面元素不包括 for(int i=top+offset;i<=bottom && num>=1;i++){ res.add(matrix[i][right]); num--; } //從右到左 最右邊元素不包括 for(int i=right-offset;i>=left && num>=1;i--){ res.add(matrix[bottom][i]); num--; } //從下到上 最上面和最下面元素不包括 for(int i=bottom-offset;i>=top+offset && num>=1;i--){ res.add(matrix[i][left]); num--; } top++; bottom--; left++; right--; } return res; }
-
我採用的是下面這種迴圈遍歷方式
-
為了對稱 也完全可以採取以下遍歷方式
-
但是採用第二種方式 要對最後一行陣列進行單獨處理(因為無法進入任何一次之前的迴圈)
-
而採用第一種遍歷方式的話 最後一行就不需要特殊處理啦
Leetcode59螺旋矩陣二
- 給你一個正整數
n
,生成一個包含1
到n2
所有元素,且元素按順時針順序螺旋排列的n x n
正方形矩陣matrix
。
public int[][] generateMatrix(int n) { int[][] res=new int[n][n]; int num=1; int target=n*n; int top=0; int bottom=n-1; int left=0; int right=n-1; int offset=1;//偏移量 while(num<=target){ //從左到右 包括上面全部資料 for(int i=left;i<=right && num<=target;i++){ res[top][i]=num; num++; } //從上到下 最上面元素不包括 for(int i=top+offset;i<=bottom && num<=target;i++){ res[i][right]=num; num++; } //從右到左 最右邊元素不包括 for(int i=right-offset;i>=left && num<=target;i--){ res[bottom][i]=num; num++; } //從下到上 最上面和最下面元素不包括 for(int i=bottom-offset;i>=top+offset && num<=target;i--){ res[i][left]=num; num++; } top++; bottom--; left++; right--; } return res; }
- 方式二 採用上面第二個圖的對稱方式來遍歷
public int[][] generateMatrix(int n) { int[][] res=new int[n][n]; //迴圈次數 int loop=n/2; //迴圈起始位置 int loopx=0; int loopy=0; //偏移量 int offset=1; //填充數字 int count=1; //開始迴圈 while(loop>0){ int i=loopx; int j=loopy; //從左到右 for(;j<loopy+n-offset;j++){ res[i][j]=count++; } //從上到下 for(;i<loopx+n-offset;i++){ res[i][j]=count++; } //從右到左 for(;j>loopy;j--){ res[i][j]=count++; } //從下到少年宮 for(;i>loopx;i--){ res[i][j]=count++; } //一次迴圈結束 loop--; loopx+=1; loopy+=1; offset+=2; } //奇數特殊處理 int mid=n/2; if(n%2==1){ res[mid][mid]=count++; } return res; }