leetcode 54. Spiral Matrix
阿新 • • 發佈:2018-12-26
這題要求很簡單,就是將給定的矩陣按螺旋形返回,我在大一的時候做過這道題,如今在leetcode看到,也是種緣分吧。
通過作圖我們可以發現,對於每個行數為m,列數為n的矩陣,螺旋的圈數不會超過m和n中的較小值。通過分析遍歷的順序和對應的圈數,我們可以得到一些對應關係,這將幫助我們確定遍歷的順序(通過標誌每次拐角的位置也可以達到同樣的效果)。特別需要注意的是,當我們在某個方向(螺旋的方向分為右,下,左,上)不能訪問任意一點的時候,說明我們已經遍歷完成了。這個時候不管圈數是多少,直接退出迴圈即可。
程式碼如下:
class Solution {
public:
vector <int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> result;
if (matrix.empty()) return result;
int m = matrix.size(); // 行數
int n = matrix[0].size(); // 列數
int count = 0; // 記錄已完成的圈數
int leftNum = m * n;
int min = m < n ? m : n;
while (count < min) {
// 向右
for (int i = count; i < n - count; i++) {
result.push_back(matrix[count][i]);
}
// 一旦沒有點加進result,說明遍歷已經完成,每螺旋一條邊都要檢查一次
if (count >= n - count) break;
// 向下
for (int i = count + 1 ; i < m - count; i++) {
result.push_back(matrix[i][n - count - 1]);
}
if (count + 1 >= m - count) break;
// 向右
for (int i = n - count - 2; i >= count; i--) {
result.push_back(matrix[m - count - 1][i]);
}
if (n - count - 2 < count) break;
// 向上
for (int i = m - count - 2; i > count; i--) {
result.push_back(matrix[i][count]);
leftNum--;
}
if (m - count - 2 <= count) break;
count++;
}
return result;
}
};