Привет, у меня есть это решение для перфекционизма. Вот ссылка, которая включает в себя вопрос: 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;
Создайте массив bool, который имеет тот же размер, что и вход, N, и оставьте все элементы в качестве значения false по умолчанию. Пронумеруйте каждый элемент X входа. Если X больше N, верните false. Если массив [N-1] равен true, верните false. В противном случае задайте массив [N-1] равным true. Повторение. Это O (N).
Объяснение: Во-первых, если у вас есть перестановка, то вам нужны элементы 1..N, но если какой-либо элемент больше N, то, безусловно, некоторые элементы отсутствуют. Во-вторых, если элемент возникает дважды, это проблема, поэтому мы создаем массив bool для запоминания уже увиденных элементов.
Я знаю, что эти вопросы заданы давно, но они все еще активны в кодовости.
Возможное решение:
public int solution(int[] A)
{
return (Enumerable.Range(1, A.Length).Except(A).Count() == 0) ? 1 : 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
Вот мой ответ 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; }