ОШИБКА: AddressSanitizer: отрицательный размер-параметр: (размер = -4) - PullRequest
0 голосов
/ 22 февраля 2019

Попытка написать некоторый код, и erase () выдает ошибку времени выполнения.Что не так с тем, как я использовал стирание?

class Solution {
    public:
        vector<int> findDisappearedNumbers(vector<int>& nums) {
            int size = nums.size();
            vector<int> list; 
            for(int i = 1; i <= size; i++)
                list.push_back(i);
            for(int i = 0; i < size; i++) {
                int num = nums[i];
                list[num - 1] = 0;
            }
            for(int i = 0; i < size; i++) {
                if(list[i] == 0) {
                    list.erase(list.begin() + i);
                }
            }
            return list;
        }
    };

Вот проблема, которую я пытаюсь решить

Учитывая массив целых чисел, где 1 ≤ a [i] ≤ n (n = размермассива), некоторые элементы появляются дважды, а другие - один раз.

Найдите все элементы из [1, n] включительно, которые не отображаются в этом массиве.

Не могли бы вы сделать это без дополнительныхпространство и в O (N) времени выполнения?Вы можете предположить, что возвращенный список не считается дополнительным пробелом.

Пример:

Ввод: [4,3,2,7,8,2,3,1]

Выход: [5,6]

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Поскольку все не-решения были помечены 0, вы можете удалить все 0 в векторе, используя list.erase( remove (list.begin(), list.end(), 0), list.end() );

0 голосов
/ 22 февраля 2019

Мое первое предложение, сконцентрируйтесь на этом:

for(int i = 0; i < size; i++) {
    if(list[i] == 0) {
            list.erase(list.begin() + i);
    }
}

Вы удаляете элементы из list, что меняет size.Это приведет к доступу к элементам за пределами вашего list.

...