Рубрики
Без рубрики

LeetCode – Удалить элемент

LeetCode – Удалить элемент из входного массива с помощью C ++, Golang и JavaScript. Теги с лецкодом, CPP, GO, JavaScript.

Постановка задачи

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