Постановка задачи
Учитывая целочисленный массив Nums и целое число валь Удалите все вхождения валь в Nums на месте Отказ Относительный порядок элементов может быть изменен.
Поскольку невозможно изменить длину массива на некоторых языках, вы должны вместо этого иметь результат быть размещенным в первая часть массива Nums Отказ Более формально, если есть к Элементы после удаления дубликатов, то первые k элементов Nums должен держать окончательный результат. Неважно, что вы оставляете за пределы первого к элементы.
Вернуть к После размещения окончательного результата в первом к Слоты Nums Отказ
Сделать не выделите дополнительное пространство для другого массива. Вы должны сделать это по Изменение входного массива на месте с O (1) дополнительной памятью.
Пользовательский судья:
Судья проверит ваше решение со следующим кодом:
int[] nums = [...]; // Input array int val = ...; // Value to remove int[] expectedNums = [...]; // The expected answer with correct length. // It is sorted with no values equaling val. int k = removeElement(nums, val); // Calls your implementation assert k == expectedNums.length; sort(nums, 0, k); // Sort the first k elements of nums for (int i = 0; i < actualLength; i++) { assert nums[i] == expectedNums[i]; }
Если все утверждения проходят, то ваше решение будет принято Отказ
Заявление о проблеме, взятые из: https://leetcode.com/problems/remove-element
Пример 1:
Input: nums = [3, 2, 2, 3], val = 3 Output: 2, nums = [2, 2, _, _] Explanation: Your function should return k = 2, with the first two elements of nums being 2. It does not matter what you leave beyond the returned k (hence they are underscores).
Пример 2:
Input: nums = [0, 1, 2, 2, 3, 0, 4, 2], val = 2 Output: 5, nums = [0, 1, 4, 0, 3, _, _, _] Explanation: Your function should return k = 5, with the first five elements of nums containing 0, 0, 1, 3, and 4. Note that the five elements can be returned in any order. It does not matter what you leave beyond the returned k (hence they are underscores).
Ограничения:
- 0 <= nums.length <= 100 - 0 <= nums[i] <= 50 - 0 <= val <= 100
Объяснение
Подход грубой силы
Появляется подход Brute Force, который впервые появляется, состоит в том, чтобы создать новый массив и скопировать все элементы на этот новый массив, кроме валь Отказ
Затем скопируйте этот новый массив в исходный массив. Но поскольку заявление о проблеме уже упоминается, что мы должны сделать это на месте, мы не можем создать новый массив.
Сложность времени вышеуказанного подхода – O (n) , но космическая сложность – O (n) слишком.
Используя два указателя
Мы можем уменьшить пространственную сложность и изменять массив на месте, используя два указателя.
Давайте проверим алгоритм.
- if nums.size() == 0 - return 0 - set i, j = 0 - loop for i = 0; i < nums.size() - 1; i++ - if nums[i] != val - nums[j++] = nums[i] // assign nums[i] to nums[j] and then increment j. - if nums[i] != val - nums[j++] = nums[i] // assign nums[i] to nums[j] and then increment j. - return j
C ++ раствор
class Solution { public: int removeElement(vector& nums, int val) { if(nums.size() == 0){ return 0; } int i, j = 0; for(i = 0; i < nums.size() - 1; i++){ if(nums[i] != val){ nums[j++] = nums[i]; } } if(nums[i] != val){ nums[j++] = nums[i]; } return j; } };
Решение Голанга
func removeElement(nums []int, val int) int { if len(nums) == 0 { return 0 } i, j := 0, 0 for ; i < len(nums) - 1; i++ { if nums[i] != val { nums[j] = nums[i] j++ } } if nums[i] != val { nums[j] = nums[i] j++ } return j }
Решение JavaScript
var removeElement = function(nums, val) { if( nums.length == 0 ){ return 0; } let i = 0, j = 0; for(; i < nums.length - 1; i++){ if( nums[i] != val ){ nums[j++] = nums[i]; } } if( nums[i] != val ){ nums[j++] = nums[i]; } return j; };
Давайте высушите наш алгоритм, чтобы увидеть, как работает решение.
Input: nums = [3, 2, 2, 3], val = 3 Step 1: if nums.size() == 0 4 == 0 false Step 2: set i, j = 0, 0 Step 3: loop for i = 0; i < nums.size() - 1 i < 3 0 < 3 true nums[i] != val nums[0] != 3 3 != 3 false i++ i = 1 Step 4: loop for i < nums.size() - 1 i < 3 1 < 3 true nums[i] != val nums[1] != 3 2 != 3 true nums[j++] = nums[i] nums[j] = nums[1] nums[0] = 2 j++ j = 1 i++ i = 2 nums = [2, 2, 2, 3] Step 4: loop for i < nums.size() - 1 i < 3 2 < 3 true nums[i] != val nums[1] != 3 2 != 3 true nums[j++] = nums[i] nums[j] = nums[1] nums[1] = 2 j++ j = 2 i++ i = 3 nums = [2, 2, 2, 3] Step 4: loop for i < nums.size() - 1 i < 3 3 < 3 false Step 5: if nums[i] != val nums[3] != 3 3 != 3 false Step 6: return j So we return the answer as 2.
Оригинал: “https://dev.to/_alkesh26/leetcode-remove-element-77e”