算法設計與分析 HW6:LeetCode 54

Description:

Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.

Note:

For example,
Given the following matrix:

[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]

You should return [1,2,3,6,9,8,7,4,5].

 

Solution:

  Analysis and Thinking:

  這是一個明顯的螺旋矩陣遍歷的問題,要求按照規定的(螺旋順序)次序來遍歷輸入的矩陣,輸出遍歷完成後的數組。可以將遍歷過程分層分佈進行,對於矩陣的每一層i,進行的都是向右、向下、向左、向上這四步順序操作,因此,解決問題的重點是求得每一步操作最終到達的位置。

  Steps:

1.依據min(mSize,rSize)/2,獲得螺旋順序遍歷矩陣的分層數layer,其中mSize爲矩陣大小,rSize爲矩陣每行大小

2.從第1層到第layer層,遍歷矩陣,每一層的起點爲(i,i)

3.先向右到達本層最右的位置(i,rSize-1-i),並將遍歷到的每個元素添加到結果數組

4.再向下到達本層(mSize-1-i,rSize-1-i)的位置,並將遍歷到的每個元素添加到結果數組

5.判斷向左是否已到達邊界,若無,則向左到達(m-1-i,i)的位置,並將遍歷到的每個元素添加到結果數組

6.判斷向上是否已到達邊界,若無,則向上到達(i,i)的位置,並將遍歷到的每個元素添加到結果數組

7.若沒有到達總層數,i+1,跳至2,若有,返回結果數組

  

Codes:


class Solution
{
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix)
    {
        vector<int> result;
        if(matrix.empty() || matrix[0].empty())
            return result;

        int mSize=matrix.size();
        int rSize=matrix[0].size();
        int mLayer=(min(mSize,rSize)+1)/2;

        for(int i=0;i<mLayer;i++)
        {
            for(int j=i;j<rSize-i;j++)
            {
                result.push_back(matrix[i][j]);
            }

            for(int j=i+1;j<mSize-i;j++)
                result.push_back(matrix[j][rSize-1-i]);

            if(mSize-1-i>i)
                for(int j=rSize-1-i-1;j>=i;j--)
                result.push_back(matrix[m-1-i][j]);
            if(rSize-1-i>i)
                for(int j=mSize-1-i-1;j>i;j--)
                result.push_back(matrix[j][i]);
        }
       return result;
    }
};


Results:



發佈了35 篇原創文章 · 獲贊 0 · 訪問量 4639
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章