• [Leetcode 68] 59 Spiral Matrix II


    Problem:

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

    For example,
    Given n = 3,

    You should return the following matrix:

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

    Analysis:

    Treat it as a simulation problem. Use a "dir" variable to represent the direction according to which to fill the data. In my solution, 1 for left, 2 for right, 3 for up and 4 for down.

    Then according to this direction variable, we fill in element k into the position (i, j). i and j is updated each time after filling according to the direction. But after the update, the new (i, j) position may be either a position already been visited or simple out of boundry, then it's the signal to update the direction. The direction transition is as follows:

    right -> down

    down -> left

    left -> up

    up -> right

    With all these updates, we can generate the spirla matrix.

    Code:

     1 class Solution {
     2 public:
     3     vector<vector<int> > generateMatrix(int n) {
     4         // Start typing your C/C++ solution below
     5         // DO NOT write int main() function
     6         vector<vector<int> > res;
     7         
     8         for (int i=0; i<n; i++) {
     9             vector<int> tmp(n, 0);
    10             res.push_back(tmp);
    11         }
    12         
    13         int sqr = n*n;
    14         
    15         // dir 1 -> left, 2 -> right, 3 -> up, 4 -> down
    16         int i=0, j=0, dir = 2;
    17         for (int k=1; k<=sqr; k++) {
    18             switch (dir) {
    19                 case 1: { 
    20                     res[i][j--] = k;
    21                     if (j < 0 || res[i][j] != 0) {
    22                         j++; i--;
    23                         dir = 3;
    24                     }
    25                     break;
    26                 }
    27                 case 2: {
    28                     res[i][j++] = k; 
    29                     
    30                     if(j >= n || res[i][j] != 0) {
    31                         j--; i++;
    32                         dir = 4;
    33                     }
    34                     break;
    35                 }
    36                 case 3: {
    37                     res[i--][j] = k; 
    38                     
    39                     if (i < 0 || res[i][j] != 0) {
    40                         i++; j++;
    41                         dir = 2;
    42                     }
    43                     break;
    44                 }
    45                 case 4: {
    46                     res[i++][j] = k; 
    47                     
    48                     if (i >= n || res[i][j] != 0) {
    49                         i--; j--;
    50                         dir = 1;
    51                     }
    52                     break;
    53                 }
    54                 default: break;
    55             }
    56         }
    57      
    58         return res;
    59     }
    60 
    61 };
    View Code
  • 相关阅读:
    课后作业之找水王
    SCRUM第二阶段第十天
    第九周总结
    冲刺一3
    用户项目
    预会热词统计
    冲刺一2
    冲刺一(一阶)1
    第八周总结
    小组合作
  • 原文地址:https://www.cnblogs.com/freeneng/p/3195684.html
Copyright © 2020-2023  润新知