Постановка задачи
Учитывая целочисленный массив 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”