Строка 933: Char 34: ошибка во время выполнения: привязка ссылки к нулевому указателю типа 'struct value_type' (stl_vector.h) - спираль кода leet - PullRequest
0 голосов
/ 13 января 2019

Я пытался решить Leetcode Проблема 54 - спираль и застрял в пустой вектор ввода.

речь идет о спиральном списке. вход является 2d вектором, а выход должен быть векторным списком, который написан по спирали.

Input:
[
  [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]

проблема в том, что вход пустой список.

Input: [] 

выдает ошибку во время выполнения.

пройдены другие тестовые случаи, кроме пустого ввода, например [] .

Кажется, во время тестирования на моем терминале Mac OSX ошибки не было, но Леткод говорит

Строка 933: Char 34: ошибка времени выполнения: ссылка на нулевой указатель типа «struct value_type» (stl_vector.h) '

вот ссылка https://leetcode.com/problems/spiral-matrix/

Также я прилагаю коды ниже ...

class Solution {
public:

vector<int> answer;
int left = 0, right = 0; 
vector<int> spiralOrder(vector<vector<int>>& matrix) {
    if(matrix[0].size()<1) return {};
    vector<vector<int>> flag(matrix.size(),vector<int>(matrix[0].size(),0));
        while(1){
           flag[left][right] =1;
           answer.push_back(matrix[left][right]);

           if(right+1<matrix[0].size() && flag[left][right+1] == 0){
               ++right;
               continue;
           }
           else if(left+1<matrix.size() && flag[left+1][right] == 0 ){
               ++left;
               continue; 
           }
           else if(right-1>=0 && flag[left][right-1]==0){
               --right;
               continue;
           }
           else if(left-1>=0  && flag[left-1][right]==0){
               --left;
               continue;
           }
           else break;
        }
    return answer; 
}
};

1 Ответ

0 голосов
/ 13 января 2019

Спасибо за комментарии, я сам решаю, как решить эту проблему. Я изменил

if(matrix[0].size()<1

до

if(matrix.empty()) return {};

и это сработало. Также я обнаружил, что мой алгоритм был неправильным и исправил его.

    using namespace std;

    enum class Direction{
          RIGHT,
          DOWN,
          LEFT,
          UP
        };
    class Solution {
    public:
        Direction direc;
        vector<int> answer;
        int left = 0, right = 0; 
        vector<int> spiralOrder(vector<vector<int>>& matrix) {
          Direction direc = Direction::RIGHT;
          if(matrix.empty()) return {};
        vector<vector<int>> flag(matrix.size(),vector<int>(matrix[0].size(),0));

            while(1){
              flag[left][right] =1;
              answer.push_back(matrix[left][right]);
              switch(direc){
              case Direction::RIGHT:        
               if(right+1<matrix[0].size() && flag[left][right+1] == 0){
                   ++right;
                   continue;
               }
               else if(left+1<matrix.size() && flag[left+1][right] == 0 ){
                   ++left;
                   direc = Direction::DOWN;
                   continue; 
               }
               else break;
             case Direction::DOWN:
              if(left+1<matrix.size() && flag[left+1][right] == 0 ){
                   ++left;
                   continue;
                }
              else if(right-1>=0 && flag[left][right-1]==0){
                   --right;
                   direc = Direction::LEFT;
                   continue;
               }
               else break;
              case Direction::LEFT: 
               if(right-1>=0 && flag[left][right-1]==0){
                   --right;
                   continue;
               }
               else if(left-1>=0  && flag[left-1][right]==0){
                   --left;
                   direc = Direction::UP;
                   continue;
              }
               else break; 
              case Direction::UP:
               if(left-1>=0  && flag[left-1][right]==0){
                   --left;
                   continue;
              }
               else if(right+1<matrix[0].size() && flag[left][right+1] == 0){
                   ++right;
                   direc = Direction::RIGHT;
                   continue;
               }
               else break;
            }
            break;
          } // switch-case
        return answer; 
    }
};
...