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

Решение: самый короткий несортированный непрерывный субрай

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

LeetCode Solutions (161 серия деталей)

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

Проблема LeetCode #581 (средняя): кратчайший несортированный непрерывный субрай

Описание:

( прыгнуть в : Идея решения Код : JavaScript | Python | Java | C ++

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

Верните самый короткий такой субрай и выведите его длину.

Примеры:

Вход: Nums = [2,6,4,8,10,9,15]
Выход: 5
Объяснение: Вам нужно сортировать [6, 4, 8, 10, 9] в порядке возрастания, чтобы сделать весь массив сортированным в порядке возрастания.
Вход: Nums = [1,2,3,4]
Выход: 0
Вход: Nums = [1]
Выход: 0

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

  • 1.length^4
  • -10 ^5 [i]^5

Идея:

( Прыгните к : Описание задачи Код : JavaScript | Python | Java | C ++

Самый простой подход здесь – просто сортировать копию входного массива ( n ), а затем сравнить оба конца из двух массивов извне, чтобы увидеть, сколько их общих элементов. Расстояние между первым расхождением на любом конце будет нашим ответом. Это решение будет O (n log n) время , Но мы можем добиться большего.

Решить эту проблему в Вовремя , мы должны рассмотреть, как мы можем сказать, правильно ли отсортирован один конец массива. Для начала, мы можем легко сказать, что левый конец Subarray разрывает порядок сортировки, когда элемент меньше, чем тот, который перед ним.

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

Это должно указывать нам на наше решение: мы должны, по сути, итерация в обратном направлении с каждого конца массива, чтобы выяснить, сколько элементов на противоположном конце находится в их надлежащем положении. Таким образом, мы будем повторять справа налево, чтобы выяснить, сколько элементов на левом конце массива является правильным, а затем наоборот слева направо для правого конца.

Мы можем сделать это, отслеживая Макс (идет налево направо) и мин (Идя прямо налево) Элементы, видимые до сих пор и отмечая, что в последний раз элемент был таким же, как Макс или мин Значения, в зависимости от направления ( слева и справа )

Мы можем рассчитать длину середины субрай от слева и Правильно а затем возврат ответ.

Реализация:

Вместо того, чтобы выполнять больше расчетов на каждой итерации, чтобы хранить правильные позиции для оставил и Правильно , мы можем просто хранить i И вместо этого сделайте наш расчет один раз в самом конце.

Код JavaScript:

( Прыгните к : Описание задачи Идея решения

var findUnsortedSubarray = function(N) {
    let len = N.length - 1, left = -1, right = -1,
        max = N[0], min = N[len]
    for (let i = 1; i <= len; i++) {
        let a = N[i], b = N[len-i]
        a < max ? right = i : max = a
        b > min ? left = i : min = b
    }
    return Math.max(0, left + right - len + 1)
};

Код Python:

( Прыгните к : Описание задачи Идея решения

class Solution:
    def findUnsortedSubarray(self, N: List[int]) -> int:
        lenN, left, right = len(N) - 1, -1, -1
        maxN, minN = N[0], N[lenN]
        for i in range(1, len(N)):
            a, b = N[i], N[lenN-i]
            if a < maxN: right = i
            else: maxN = a
            if b > minN: left = i
            else: minN = b
        return max(0, left + right - lenN + 1)

Код Java:

( Прыгните к : Описание задачи Идея решения

class Solution {
    public int findUnsortedSubarray(int[] N) {
        int len = N.length - 1, left = -1, right = -1,
            max = N[0], min = N[len];
        for (int i = 1; i <= len; i++) {
            int a = N[i], b = N[len-i];
            if (a < max) right = i;
            else max = a;
            if (b > min) left = i;
            else min = b;
        }
        return Math.max(0, left + right - len + 1);
    }
}

C ++ Код:

( Прыгните к : Описание задачи Идея решения

class Solution {
public:
    int findUnsortedSubarray(vector& N) {
        int len = N.size() - 1, left = -1, right = -1,
            maxN = N[0], minN = N[len];
        for (int i = 1; i <= len; i++) {
            int a = N[i], b = N[len-i];
            if (a < maxN) right = i;
            else maxN = a;
            if (b > minN) left = i;
            else minN = b;
        }
        return max(0, left + right - len + 1);
    }
};

LeetCode Solutions (161 серия деталей)

Оригинал: “https://dev.to/seanpgallivan/solution-shortest-unsorted-continuous-subarray-22o2”