[Leetcode] Spiral Matrix II(Medium)

LeetCode 59 - Spiral Matrix II

Given a positive integer n, generate an n x n matrix filled with elements from 1 to n2 in spiral order.

example

Input: n = 3
Output: [[1,2,3],[8,9,4],[7,6,5]]
Input: n = 1
Output: [[1]]

How can we solve this problem?

這題跟Spiral Matrix做法差不多,我們不難發現他的移動模式就是(右→下↓左←上),我們只需要通過幾個變數來限制移動的步數。另外,這題需要我們返回一個n2的array,所以,需要額外定義一個counter來記錄每次插入的數值為多少,因此,只要counter 到達n2的大小就知道是否完成插入所需的值。

Solution:

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        //total step n^2
        vector<vector<int>> res(n,vector<int>(n,0));
        int c = 1;
        int upperRow = 0,lowerRow = n - 1;
        int upperCol = 0,lowerCol = n - 1;
        while(c <= n*n){
            //moving left
            if(upperCol <= lowerCol){
                //n step
                for(int i = upperCol;i<=lowerCol;i++){
                    res[upperRow][i] = c++;
                }
            }
            upperRow ++; //moving down
            
            //moving down
            if(upperRow <= lowerRow){
                for(int i = upperRow;i<=lowerRow;i++){
                    res[i][lowerCol] = c++;
                }
            }
            lowerCol--;
            
            //moving right
            if(lowerCol >= upperCol){
                for(int i = lowerCol;i>=upperCol;i--){
                    res[lowerRow][i] = c++;
                }
            }
            lowerRow --;
            //moving up
            if(lowerRow >= upperRow){
                for(int i = lowerRow;i>=upperRow;i--){
                    res[i][upperCol] = c++;
                }
            }
            upperCol ++;
            
        }     
        return res;
    }
};