PermCheck codility. O (N) сложность времени

1

Привет, у меня есть это решение для перфекционизма. Вот ссылка, которая включает в себя вопрос: https://codility.com/demo/results/demo73YNCU-8FK/

Я получил 100% за это, но у меня есть временная сложность O (N * log (N)) или O (N). Как я могу сделать этот код O (N)? Не могли бы вы также дать краткое описание того, что делает код O (N)? Спасибо.

Код для ярлыка:

    Array.Sort(A);
    if(A[0] == 1 && A.Length == 1) return 1;
    if(A[0] != 1) return 0;

    int n = 0;
    for(int i = 0; i < A.Length; i++)
    {    
        if(i < A.Length - 1)
        {
            if(A[i+1] == A[i] + 1)
            {
                n += 1;
            }
            else 
            {
                return 0;   
            }
        }

    }
    return 1;
  • 0
    Я думаю, что это было бы лучше подходит для codereview.stackexchange.com .
  • 0
    Спасибо, Abrixas2. Я выложу там
Показать ещё 1 комментарий
Теги:
performance
algorithm
time-complexity

4 ответа

5
Лучший ответ

Создайте массив bool, который имеет тот же размер, что и вход, N, и оставьте все элементы в качестве значения false по умолчанию. Пронумеруйте каждый элемент X входа. Если X больше N, верните false. Если массив [N-1] равен true, верните false. В противном случае задайте массив [N-1] равным true. Повторение. Это O (N).

Объяснение: Во-первых, если у вас есть перестановка, то вам нужны элементы 1..N, но если какой-либо элемент больше N, то, безусловно, некоторые элементы отсутствуют. Во-вторых, если элемент возникает дважды, это проблема, поэтому мы создаем массив bool для запоминания уже увиденных элементов.

0

Я знаю, что эти вопросы заданы давно, но они все еще активны в кодовости.

Возможное решение:

public int solution(int[] A)
{
    return (Enumerable.Range(1, A.Length).Except(A).Count() == 0) ? 1 : 0;
}
0

Это мое решение, которое набрало 100% правильности и производительности.

def (A): arraylength = len (A)

if (arraylength > 100000):
    raise ValueError("Out of bound range")    

arr = sorted(A)

for i in range(arraylength):

    if (arr[i] != i+1):
        return 0

return 1 
0

Вот мой ответ 100/100:

такая же идея, как @fejesjoco

https://codility.com/demo/results/demoNR485D-33P/

Вы можете изменить int на длинные, чтобы получить производительность.

    public int solution(int[] A)
    {
        // idea: add to set,dictionary. Count the size and compare to N.
        // dedupe data when needed. 
        var set = new HashSet<int>();
        var max = int.MinValue;

        foreach (var item in A)
        {
            if (set.Contains(item)) return 0;

            set.Add(item);
            if (item > max) max = item;
        }
        return set.Count == max ? 1 : 0;
    }
  • 0
    Как изменение на долгое связано с производительностью?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню