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

LeetCode: самая длинная арифметическая подпоследовательность

Это является частью ряда объяснений LeetCode и других кураторских объяснений (индекс). Если тебе понравилось … Помечено Java, Python, Algorithms, Career.

Взломать интервью по кодированию (серия 6 деталей)

Это является частью ряда объяснений LeetCode и других кураторских объяснений (индекс). Если вам понравилось это решение или вы нашли его полезным, пожалуйста, нравится этот пост.

Проблема LeetCode #1027 (среда): самая длинная арифметическая последующая последовательность

Учитывая массивные числа целых чисел, верните длину самой длинной арифметической последующей последовательности в Nums.

Напомним, что последующая массива NUMS – это список Nums [i1], Nums [i2], …, Nums [ik] с 0

Пример 1:

Ввод: Nums = [3,6,9,12] Вывод: 4 Объяснение: Весь массив представляет собой арифметическую последовательность с шагами.

Пример 2:

Ввод: Nums = [9,4,7,2,10] Вывод: 3 Объяснение: Самая длинная арифметическая подпоследовательность – [4,7,10].

Пример 3:

Ввод: Nums = [20,1,15,3,10,5,8] Вывод: 4 Объяснение: Самая длинная арифметическая подпоследовательность – [20,15,10,5].

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

2. Length 0 [i]

Предварительное условие

Что такое арифметическая подпоследовательность?

Во время средней школы мы узнали эту концепцию с другим названием * *Арифметическая прогрессия (AP) * . Идея довольно проста. Последовательность чисел называется AP AP, если есть не менее 3 чисел, и они равноудачны друг от друга!

Итак, 1 8 15 AP AS 1 (+7) 8 (+7) 15 У нас есть разница в 7, и поэтому, если бы я спросил вас, какой номер будет дальше – что бы вы сказали?

  • 22?

Также вы заметили интересный факт здесь – в отсортированном списке 1 + x 8 -> Средний номер при удвоении равен сумме его соседей! Не забывайте об этом 😉

Решение

Итак, мы знаем, как распознать AP, но как мы находим самый длинный AP, также рассмотрим эти вариации

  • AP может иметь отрицательные числа
    • -1 2 5 8 является действительным AP
  • AP может быть неупорядочен (не отсортирован)
    • 5 9 1 является действительным AP = 1 5 9
  • Последующая AP
    • 5 4 9 1 имеет действительный AP Последующая последовательность -> 1 5 9

Хорошо, так что давайте возьмем один пример: 9 4 7 2 10

Один из способов взглянуть на решение – сначала сортировать их 2 4 7 9 10 -> Вы видите последующую AP? 4 7 10 – Здесь длина 3, а разница также 3

Примечание 2,4 и 7,9 не являются действительным AP, хотя они имеют одинаковую разницу. Но для этой проблемы мы можем сказать, что она имеет длину по 2 каждый с разницей также 2.

Выяснить алгоритм

Естественно, когда мы видим проблему максимизации или минимизации, что мы хотим, чтобы сравнить все результаты и вернуть макс или мин. Нам понадобятся концепции динамического программирования здесь!

Если вы видите пример выше, можем ли мы сказать, что разница в том, что это ключ, и пара (последний индекс нашей цепи и максимальной длины) является нашим значением?

  • Зачем вам нужна пара в качестве значения? Скажи, что у нас есть еще один пример 1 2 14 15 16 27 29 30 43

      Сколько у нас AP:
      • Diff [1 15 29]
      • Diff [1 15 29 43]
      • Diff [1 14 27]
      • Diff [2 16 30]

Как вы можете заметить, у нас есть такая же разница, но одна пара 14 имеет больше всего чисел 1 15 29 43

Так что, если мы храним значения DP как карту карты с различием в качестве ключа – возможно, проблема не так уж и сложна!

Давайте посмотрим код

Реализация

    public int longestArithSeqLength(int[] nums) {
        int size = nums.length;
        // Stores the length of sequences having same difference
        Map> dp = new HashMap<>();

        // Stores the resultant length
        int res = 2;

        // Iterate over the array
        for (int i = 0; i < size; i++) {
            for (int j = i + 1; j < size; j++) {

                // our dp key is diff
                int diff = nums[j] - nums[i];

                 // here we store the pair of last index which gives us max difference
                Map temp = new HashMap<>();

                // Update length of subsequence
                if (dp.containsKey(diff)) {
                    temp = dp.get(diff);

                    if (temp.containsKey(i)) {
                        temp.put(j, temp.get(i) + 1);
                    }
                }

                temp.putIfAbsent(j, 2);

                dp.put(diff, temp);
                res = Math.max(res, temp.get(j));
            }
        }

        return res;
    }

Анализ

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

Если вы возьмете на себя решение для использования какого -то двухмерного решения на основе массива – продолжайте 😄

У нас будет длина по умолчанию 2 для каждой пары!

    итерация
    • J = 2 -> 4-2 -> 2, (2, 2 )
    • J = 3 -> 7-2 -> 5, (3, 2)
    • J = 4 -> 9-2 -> 7, (4, 2)
    • J = 5 -> 10-2 -> 8, (5, 2)
        итерация
        • J = 3 -> 7-4 -> 3, (3, 2)
        • J = 5 -> 10-4 -> 6, (5, 2)
            итерация
              • итерация
                • J = 5 -> 10-9 -> 1, (5, 1)
                  • Так что максимальная длина составляет 3!

Взломать интервью по кодированию (серия 6 деталей)

Оригинал: “https://dev.to/saurabhpro/leetcode-longest-arithmetic-subsequence-4jal”