Вопрос
Учитывая массив целых чисел nums длины n, где все целые числа nums находятся в диапазоне [1, n], и каждое целое число встречается один раз или дважды, вернуть массив всех целые числа, которые появляются дважды.
Вы должны написать алгоритм, который работает за O(n) времени и использует только постоянное дополнительное пространство.
Пример 1:
Ввод: число = [4,3,2,7,8,2,3,1]
Вывод: [2,3]
Пример 2:
Ввод: число = [1,1,2]
Вывод: [1]
Пример 3:
Ввод: число = [1]
Вывод: []
Ограничения:
n == nums.length1 <= n <= 1051 <= nums[i] <= n- Каждый элемент в
numsпоявляется один раз или дважды.
Решение первое
Анализ:
Используйте уникальную функцию Set, чтобы непрерывно добавлять числа в nums к пустому Set, а затем используйте метод set.add, чтобы определить, есть ли повторяющиеся числа, увеличивая длину set.
Код:
/** * @param {number[]} nums * @return {number[]} */ var findDuplicates = function (nums) { const set = new Set(); // unique value test const result = []; // result arraynums.forEach((n) => { const preSize = set.size;// Use the set.add method to determine whether there are duplicate numbers by getting the length of the set to increase set.add(n);// find duplicate numbers if (preSize === set.size) { result.push(n); } });return result; };
Решение второе
Анализ:
Пройдите весь массив, обработайте каждое число как информацию о позиции массива, а затем измените число, соответствующее каждой позиции, на отрицательное число, что эквивалентно созданию отметки, указывающей, что позиция, соответствующая этому числу, уже занята числом. , и мы встретимся снова в следующий раз Если это число окажется отрицательным, значит, оно уже появилось.
Например, [4,3,2,7,8,2,3,1], при достижении первого 2 число 3, чья позиция 1, переворачивается на -3, переходите к следующему 2 можно найти число -3 в позиции 1, которое было перевернуто, что указывает на то, что число 2 встречается дважды .
Код:
/** * @param {number[]} nums * @return {number[]} */ var findDuplicates = function(nums) { let result = []; for (let i = 0; i < nums.length; i++) { let num = Math.abs(nums[i]); if (nums[num - 1] > 0) { /** The purpose of flipping the number to a negative number is to make a mark to indicate that the position corresponding to the number is already occupied by a number. If the number is found to be a negative number next time, it means that it has already appeared.For example [4,3,2,7,8,2,3,1]When you go to the first 2, the number in position 1 is 3, flip the 3 to -3, and when you go to the next 2, when you flip 3, you find that it has been flipped. */ nums[num - 1] *= -1; } else { result.push(num); } } return result;};
Ознакомьтесь с дополнительными примечаниями LeetCode: https://lwebapp.com/en/tag/leetcode