- 操作系統:ubuntu22.04
- IDE:Visual Studio Code
- 編程語言:C++11
題目描述
輸入一個矩陣,按照從外向里以順時針的順序依次打印出每一個元素。
例如:
輸入矩陣:
[[ 1, 2, 3 ],[ 4, 5, 6 ],[ 7, 8, 9 ]
]輸出:[1,2,3,6,9,8,7,4,5]
解法思路:模擬邊界遍歷(按圈打印)
這是一個非常經典的二維數組模擬題。
🧠 思路總結:
我們可以把矩陣想象成一圈一圈的“洋蔥”,從最外層開始,順時針打印每一圈的四條邊:
- 從左到右 打印上邊;
- 從上到下 打印右邊;
- 從右到左 打印下邊;
- 從下到上 打印左邊;
每打印完一層就縮小一圈范圍,直到所有元素都被訪問。
實現代碼
#include <vector>
using namespace std;class Solution {
public:vector< int > spiralOrder( vector< vector< int > >& matrix ){vector< int > result;if ( matrix.empty() )return result;int rows = matrix.size();int cols = matrix[ 0 ].size();// 定義當前圈的四個邊界int top = 0, bottom = rows - 1;int left = 0, right = cols - 1;while ( top <= bottom && left <= right ){// 1. 從左到右for ( int i = left; i <= right; ++i ){result.push_back( matrix[ top ][ i ] );}top++; // 上邊界下移// 2. 從上到下for ( int i = top; i <= bottom; ++i ){result.push_back( matrix[ i ][ right ] );}right--; // 右邊界左移// 注意:可能只剩一行或一列的情況,需要判斷是否還存在下邊和左邊if ( top <= bottom ){// 3. 從右到左for ( int i = right; i >= left; --i ){result.push_back( matrix[ bottom ]`在這里插入代碼片`[ i ] );}bottom--; // 下邊界上移}if ( left <= right ){// 4. 從下到上for ( int i = bottom; i >= top; --i ){result.push_back( matrix[ i ][ left ] );}left++; // 左邊界右移}}return result;}
};#include <iostream>int main()
{vector< vector< int > > matrix = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };Solution sol;vector< int > result = sol.spiralOrder( matrix );cout << "順時針打印結果:" << endl;for ( int num : result ){cout << num << " ";}return 0;
}
運行結果
順時針打印結果:
1 2 3 6 9 8 7 4 5