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

LeetCode – удалить дубликаты из отсортированного массива

LeetCode – удалите все дубликаты из отсортированного массива, используя C ++, Golang и JavaScript. Tagged with LeetCode, CPP, Go, JavaScript.

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

Учитывая отсортированный массив Nums , удалить дубликаты на месте, так что каждый элемент появляется только один раз и возвращает новую длину.

Не распределяйте дополнительное место для другого массива, Вы должны сделать это путем изменения массива ввода на месте с O (1) дополнительная память.

Заявление о проблеме, взятое из: https://leetcode.com/problems/remove-duplicates-from-sorted-array

Пример 1:

Input: nums = [1, 1, 2]
Output: 2, nums = [1, 2]
Explanation: Your function should return length = 2, with the first two elements of nums being 1 and 2 respectively. It doesn't matter what you leave beyond the returned length.

Пример 2:

Input: nums = [0, 0, 1, 1, 1, 2, 2, 3, 3, 4]
Output: 5, nums = [0, 1, 2, 3, 4]
Explanation: Your function should return length = 5, with the first five elements of nums being modified to 0, 1, 2, 3, and 4 respectively. It doesn't matter what values are set beyond the returned length.

Ограничения:

- 0 <= nums.length <= 3 * 10^4
- -10^4 <= nums[i] <= 10^4
- nums is sorted in ascending order.

Объяснение

Грубая сила

Что ж, проблема говорит о том, чтобы решить его без какого -либо дополнительного пространства, но первый подход Brute Force, который мы получаем, состоит в том, чтобы подсчитать возникновение различных элементов и хранить его в хэш (или объекте).

Ключ будет элемент массива, и значение будет количество раз, когда элемент появлялся в массиве.

Затем мы повторяем хеш и храним ключи в новом массиве.

Решение требует дополнительного места для нового массива и нового хэша.

Два указателя

Чтобы улучшить вышеуказанный подход, мы можем воспользоваться преимуществами отсортированного массива здесь. Мы можем использовать два указателя i и Дж . Мы продолжаем увеличивать J До времени Nums [i] [j] Анкет

Давайте проверим алгоритм ниже:

- return if nums size <= 1

- set i = 0

- Loop for j = 1; j < nums.size(); j++
  - if nums[j] != nums[i]
    - i++
    - nums[i] = nums[j]

- return i + 1

Временная сложность приведенного выше подхода – O (n) И сложность пространства – это O (1) .

C ++ Решение
class Solution {
public:
    int removeDuplicates(vector& nums) {
        if(nums.size() <= 1){
            return nums.size();
        }

        int i = 0;

        for(int j = 1; j < nums.size(); j++){
            if(nums[j] != nums[i){
                i++
                nums[i] = nums[j];
            }
        }

        return i + 1;
    }
};
Голанг раствор
func removeDuplicates(nums []int) int {
    length := len(nums)

    if length <= 1 {
        return length
    }

    i := 0

    for j := 1; j < length; j++ {
        if nums[i] != nums[j] {
            i++
            nums[i] = nums[j]
        }
    }

    return i + 1
}
JavaScript Solution
var removeDuplicates = function(nums) {
    const length = nums.length;

    if( length <= 1 ){
        return length;
    }

    let i = 0;

    for(let j = 1; j < length; j++){
        if( nums[i] != nums[j] ){
            i++;
            nums[i] = nums[j];
        }
    }

    return i + 1;
};

Давайте сушат наш алгоритм, чтобы увидеть, как работает решение.

nums = [0,0,1,1,1,2,2,3,3,4]

Step 1: length = nums.size()
               = 10

Step 2: length <= 1
            10 <= 1
            false

Step 3: i = 0

Step 4: Loop for j = 1; 1 < 10
        nums[i] != nums[j]
        nums[0] != nums[1]
        0 != 0
        false

        j++
        j = 2

Step 5: Loop for j = 2; 2 < 10
        nums[i] != nums[j]
        nums[0] != nums[2]
        0 != 1
        true

        i++
        i = 1

        nums[i] = nums[j]
        nums[1] = nums[2]
        nums[1] = 1

        j++
        j = 3

Step 6: Loop for j = 3; 3 < 10
        nums[i] != nums[j]
        nums[1] != nums[3]
        1 != 1
        false

        j++
        j = 4

Step 7: Loop for j = 4; 4 < 10
        nums[i] != nums[j]
        nums[1] != nums[4]
        1 != 1
        false

        j++
        j = 5

Step 8: Loop for j = 5; 5 < 10
        nums[i] != nums[j]
        nums[1] != nums[5]
        1 != 2
        true

        i++
        i = 2

        nums[i] = nums[j]
        nums[2] = nums[5]
        nums[2] = 2

        j++
        j = 6

Step 9: Loop for j = 6; 6 < 10
        nums[i] != nums[j]
        nums[2] != nums[6]
        2 != 2
        false

        j++
        j = 7

Step 10: Loop for j = 7; 7 < 10
         nums[i] != nums[j]
         nums[2] != nums[7]
         2 != 3
         true

         i++
         i = 3

         nums[i] = nums[j]
         nums[3] = nums[7]
         nums[3] = 3

         j++
         j = 8

Step 11: Loop for j = 8; 8 < 10
         nums[i] != nums[j]
         nums[3] != nums[8]
         3 != 3
         false

         j++
         j = 9

Step 12: Loop for j = 9; 9 < 10
         nums[i] != nums[j]
         nums[3] != nums[9]
         3 != 4
         true

         i++
         i = 4

         nums[i] = nums[j]
         nums[4] = nums[9]
         nums[4] = 4

         j++
         j = 10

Step 13: Loop for j = 10; 10 < 10
         false

Step 14: return i + 1
         return 4 + 1 = 5

Оригинал: “https://dev.to/_alkesh26/leetcode-remove-duplicates-from-sorted-array-2p9f”