- 螺旋矩陣
- 螺旋矩陣 - 力扣(LeetCode) https://leetcode.cn/problems/spiral-matrix/submissions/521329682/ 給你一個 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 示例 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] 1 2 提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100
題解
這題和59. 螺旋矩陣 II差不多,但是因為行和列不同變得更復雜一些。
如果要了解59. 螺旋矩陣 II,可以去看刷題之Leetcode59題(超級詳細)-CSDN博客這篇博客
相對於59. 螺旋矩陣 II而言,有些改變:
循環的次數等於行和列中的最小值除以2
當行和列中的最小值是奇數,則會有沒有遍歷到的位置
如果行數大於列數,則會產生中間列沒有遍歷 如果列數大於等於行數,則會產生中間行沒有遍歷 中間行或中間列的位置mid = 行和列中的最小值除以二的值
中間行的最大下標的下一位為mid + 列數 - 行數 + 1
中間列的最大下標的下一位為mid + 行數 - 列數 + 1
從上到下列的終止條件是小於列數 - 停止下標(offSet)
從左到右遍歷行的終止條件是小於行數 - 停止下標(offSet)
相同的地方是:從右向左遍歷行和從下向上遍歷列的終止條件都是大於遍歷起點start 每次遍歷完start++,offSet++ 代碼
class Solution { public List ans = new ArrayList<>(); //列數 int columns = matrix[0].length; //行數 int rows = matrix.length; //遍歷起點 int start = 0; //循環的次數 行數和列數中的最小值除以二 int loop = Math.min(rows,columns) / 2; //未遍歷的中間列(行)的列(行)下標 int mid = loop; //終止條件 int offSet = 1; int i,j; while(loop-- > 0) { //初始化起點 i = j = start;
//從左往右
for(; j < columns - offSet; j++)
ans.add(matrix[i][j]);
//從上往下
for(; i < rows - offSet; i++)
ans.add(matrix[i][j]);
//從右往左
for(; j > start; j--)
ans.add(matrix[i][j]);
//從下往上
for(; i > start; i--)
ans.add(matrix[i][j]);
//每循環一次 改變起點位置
start++;
//終止條件改變
offSet++;
}
//如果行和列中的最小值是奇數 則會產生中間行或者中間列沒有遍歷
if(Math.min(rows,columns) % 2 != 0) {
//行大於列則產生中間列
if(rows > columns) {
//中間列的行的最大下標的下一位的下標為mid + rows - columns + 1
for(int k = mid; k < mid + rows - columns + 1; k++) {
ans.add(matrix[k][mid]);
}
}else {//列大於等於行則產生中間行
//中間行的列的最大下標的下一位的下標為mid + columns - rows + 1
for(int k = mid; k < mid + columns - rows + 1; k++) {
ans.add(matrix[mid][k]);
}
}
}
return ans;
}
} 一鍵獲取完整項目代碼 java
———————————————— 版權聲明:本文為CSDN博主「向着五星的方向」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/qq_69748833/article/details/137512010