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

Решение: максимальное значение стирания

Это является частью серии пояснений решения LeetCode (индекс). Если вам понравилось это решение или Фу … помечены алгоритмами, JavaScript, Java, Python.

Решения LeetCode (161 часть серии)

Это является частью серии объяснений решения LeetCode ( index ). Если вам понравилось это решение или нашел его полезным, Пожалуйста, как Этот пост и/или УПОТАТЬ Мое решение пост на форумах LeetCode Отказ

Проблема лецкода # 1695 (средний): максимальное значение стирания

Описание:

( Перейти к : Идея решения Код : JavaScript | Python |. Java |. C ++

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

Вернуть максимальная оценка Вы можете получить, стирание ровно один подвеска .

Массив B называется подлома А Если это образует смежную подпоследовательность А то есть, если он равен [l], [L + 1], ... , [R] Для некоторых (L, R) Отказ

Примеры:

Вход: nums = [4,2,4,5,6]
Вывод: 17
Объяснение: Оптимальная подпорка здесь – [2,4,5,6].
Вход: nums = [5,2,1,2,5,2,1,2,5]
Вывод: 8
Объяснение: Оптимальная подпорка здесь составляет [5,2,1] или [1,2,5].

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

  • 1. Длина ^ 5.
  • 1 [я] ^ 4

Идея:

( Перейти к : Описание проблемы Код : JavaScript | Python |. Java |. C ++

Как и большинство проблем, которые спрашивают о смежном подломе, эта проблема естественно требует 2-указательное скользящее окно подход. Есть несколько способов отслеживать содержимое скользящего окна, но поскольку ограничение на Nums [I] довольно маленький, мы можем использовать более быстрый arraymap. ( NMAP ) Метод, а не hashmap Отказ

Так как мы повторяем наше скользящее окно через Nums Мы переместим наши правильно Указатель вперед, увеличивая счетчик для соответствующего числа в NMAP Отказ Если это ведро в NMAP идет выше 1 Тогда мы знаем, что в новом добавленном номере не уникальна в нашем скольжении, поэтому нам нужно увеличить левый указатель, пока счетчик не будет уменьшен обратно в 1 Отказ

Мы также должны, конечно, отслеживать сумму Всего скользящего окна. На каждой итерации, как только мы подтвердили уникальность содержимого скользящего окна, мы также должны обновлять наш Лучший Результат до сих пор. Затем, как только мы закончим, мы можем просто Вернитесь Best Отказ

  • Сложность времени: O (n) где N это длина числа
  • Космическая сложность: O (10001) за невысокий Отслеживание чисел от 0 к 10^4

Код JavaScript:

( Перейти к : Описание проблемы Идея решения

var maximumUniqueSubarray = function(nums) {
    let nmap = new Int8Array(10001), total = 0, best = 0
    for (let left = 0, right = 0; right < nums.length; right++) {
        nmap[nums[right]]++, total += nums[right]
        while (nmap[nums[right]] > 1)
            nmap[nums[left]]--, total -= nums[left++]
        best = Math.max(best, total)
    }
    return best
};

Код Python:

( Перейти к : Описание проблемы Идея решения

class Solution:
    def maximumUniqueSubarray(self, nums: List[int]) -> int:
        nmap, total, best, left = [0] * 10001, 0, 0, 0
        for right in nums:
            nmap[right] += 1
            total += right
            while nmap[right] > 1:
                nmap[nums[left]] -= 1
                total -= nums[left]
                left += 1
            best = max(best, total)
        return best

Java код:

( Перейти к : Описание проблемы Идея решения

class Solution {
    public int maximumUniqueSubarray(int[] nums) {
        short[] nmap = new short[10001];
        int total = 0, best = 0;
        for (int left = 0, right = 0; right < nums.length; right++) {
            nmap[nums[right]]++;
            total += nums[right];
            while (nmap[nums[right]] > 1) {
                nmap[nums[left]]--;
                total -= nums[left++];
            }
            best = Math.max(best, total);
        }
        return best;
    }
}

C ++ код:

( Перейти к : Описание проблемы Идея решения

class Solution {
public:
    int maximumUniqueSubarray(vector& nums) {
        char nmap[10001]{0};
        int total = 0, best = 0;
        for (int left = 0, right = 0; right < nums.size(); right++) {
            nmap[nums[right]]++, total += nums[right];
            while (nmap[nums[right]] > 1)
                nmap[nums[left]]--, total -= nums[left++];
            best = max(best, total);
        }
        return best;
    }
};

Решения LeetCode (161 часть серии)

Оригинал: “https://dev.to/seanpgallivan/solution-maximum-erasure-value-1kod”