Как проверить, является ли массив int массивом, отсортированным по кругу?

У меня есть целочисленный массив, скажем {1, 3, 4, 7, -9, 0}. Этот массив отсортирован по кругу, а массив {2, 4, 9 , 3} не сортируется по кругу.

Массив сортируется по кругу, если его элементы сортируются, за исключением вращения.

Например:

4 5 6 7 1 2 3

Элементы здесь 1 2 3 4 5 6 7, являются "в порядке", но они поворачиваются влево на три. Поэтому, если мы повернем вправо на 3, получим 1 2 3 4 5 6 7, который является отсортированным массивом.

Учитывая массив, как вы можете проверить, отсортирован ли массив по кругу?

Ответы

Ответ 1

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

Edit:

Я чувствую, что люди отказываются от решения Дэниела, потому что они не понимают его или не думают, что он сломан. Это печально, потому что я думаю, что его решение блестяще.

def is_circular_sorted(arr):
    count = 0
    length = len(arr)
    for i in range(length):
        if arr[i] > arr[(i+1) % len(arr)]:
            count += 1
    return count <= 1

In [4]: is_circular_sorted([1, 2, 3, 4])
Out[4]: True

In [5]: is_circular_sorted([1, 1, 1, 1])
Out[5]: True

In [6]: is_circular_sorted([1, 3, 4, 7, -9])
Out[6]: True

In [7]: is_circular_sorted([1, 3, 4, 2])
Out[7]: False

Немного объясним. Чтобы проверить, отсортирован ли список по кругу, мой первоначальный ответ сказал, что вам нужно проверить, был ли один или менее "разрыв" от полного сортировки. И все числа после "перерыва" были меньше первого числа в массиве.

Однако, как показывает ответ Дэниела, вам не нужно проверять ВСЕ числа после "перерыва", только последнее число (что также является самым большим/максимальным числом после перерыва, потому что они отсортированы).

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

Ответ 2

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

public boolean isCircularSorted(int[] array)
{
    int size = array.length;
    int count = 0;

    for(int x=0; x<size; x++)
        if(array[x] > array[(x+1)%size])
            count ++;
    return (count <= 1);
}

Об этом также говорил пользователь Daniel.

Ответ 3

Как сказал @Daniel, используя value[i] > value[(i+1)%length], если он true, мы подсчитаем 1, если count в конце равно 0 или 1, исходный array - это отсортированный по кругу массив! Я думаю, что это хороший способ!