スパイラル行列
タイトル説明
mxnサイズの行列(m行、n列)が与えられると、行列内のすべての要素がスパイラル順に返されます。
たとえば
、次の行列があるとします。
[↵[1、2、3]、↵
[4、5、6 ]、↵ [7、8、9 ]↵] [1,2,3,6,9 ]を返す必要があります、8、7、4、5]。
mxn要素(m行、n列)の行列が与えられた場合、行列のすべての要素をスパイラル順に返します。
たとえば
、次の行列があるとします。
[↵[1、2、3]、↵
[4、5、6 ]、↵ [7、8、9 ]↵]↵ [1,2,3,6,9,8,7,4、 5]。
問題解決のアイデア
- スパイラルマトリックスを同心円状のマトリックスと考えてください。時計回りに外側から内側にレイヤーごとに移動します。
- 4つの境界を設定します:左、右、上、下、初期値はそれぞれ0、n-1、0、m-1です
- 各同心行列の4つの境界範囲(上側から開始)は、左〜右、上+ 1〜下、右-1〜左、下+ 1〜上-1です。
- 同心円行列をトラバースした後、left ++、right-、top-、bottom ++
- この質問とスパイラルマトリックス質問IIの違いは、上界と右界を横断した後、それぞれ下界と左界を横断するときに、上<下と左<右の判断を追加する必要があることです。それ以外の場合は、上下の境界または左右の境界が重なると、読み取りが繰り返されます。
class Solution {
public:
vector<int> spiralOrder(vector<vector<int> > &matrix) {
vector<int> res;
int m = matrix.size();
if(0 == m) return res;
int n = matrix[0].size();
//四个边界
int left(0), right(n - 1), top(0), bottom(m - 1);
while(left <= right && top <= bottom) {
//上边界
for(int i = left; i <= right; i ++) {
res.push_back(matrix[top][i]);
}
//右边界
for(int i = top + 1; i <= bottom; i ++) {
res.push_back(matrix[i][right]);
}
//注意要加判断,如果top==bottm,则代表上下边界重合了,需要跳过
if(top < bottom) {
//下边界
for(int i = right - 1; i >= left; i --) {
res.push_back(matrix[bottom][i]);
}
}
//注意要加判断,如果left==right,则代表左右边界重合了,需要跳过
if(left < right) {
//左边界
for(int i = bottom - 1; i >= top + 1; i --) {
res.push_back(matrix[i][left]);
}
}
//进入下一个内层
left ++; right --; top ++; bottom --;
}
return res;
}
};