2021-09-16 Daily-Challenge

Today I have done leetcode's September LeetCoding Challenge with cpp.

September LeetCoding Challenge 16

Description

Spiral Matrix

Given an m x n matrix, return all elements of the matrix in spiral order.

Example 1:

img

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

Example 2:

img

Input: matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
Output: [1,2,3,4,8,12,11,10,9,5,6,7]

Constraints:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 10
  • -100 <= matrix[i][j] <= 100

Solution

class Solution {
  int moves[4];
  vector<bool> visit;
  int cols;
  int total;
  
  void init() {
    moves[0] = 1;
    moves[1] = cols;
    moves[2] = -1;
    moves[3] = -cols;
  }
  
  bool check(int pos, int direction) {
    return (direction == 0 && !((pos+1) % cols)) || \
            (pos + moves[direction] >= total)    || \
            (direction == 2 && !(pos % cols))    || \
            (pos + moves[direction] < 0)         || \
            visit[pos+moves[direction]]; 
  }
public:
  vector<int> spiralOrder(vector<vector<int>>& matrix) {
    cols = matrix.front().size();
    total = cols * matrix.size();
    init();
    visit.resize(total);
    vector<int> answer;
    int direction = 0, pos = 0;
    while(answer.size() < total) {
      answer.push_back(matrix[pos/cols][pos%cols]);
      visit[pos] = true;
      int turns = 0;
      while(turns < 4 && check(pos, direction)) {
          turns += 1;
          direction = (direction + 1) % 4;
      }
      pos += moves[direction];
    }
    return move(answer);
  }
};

// Accepted
// 23/23 cases passed (0 ms)
// Your runtime beats 100 % of cpp submissions
// Your memory usage beats 72.32 % of cpp submissions (6.8 MB)