Новогодний хаос Оптимизация кода HackerRank

2
static void minimumBribes(int[] q)
{
    Int32 TotalCount = 0;
    bool blnSuccess = true;
    Int32[] size = Ordering(q);
    for (int intI = 0; intI < q.Length; intI++)
    {
        Int32 Tempvariable = 0;
        Int32 TooChaotic = 0;
        Int32 index = Index(size,q[intI]);
        do
        {
            if (q[intI] != size[intI])
            {
                Tempvariable = size[index];
                size[index] = size[index - 1];
                size[index - 1] = Tempvariable;
                index = index - 1;
                TooChaotic = TooChaotic + 1;
                if (TooChaotic > 2)
                {
                    break;
                }
                TotalCount = TotalCount + 1;
            }
        } while (q[intI] != size[intI]);
        if (TooChaotic > 2)
        {
            Console.WriteLine("Too chaotic");
            blnSuccess = false;
            break;
        }
    }
    if (blnSuccess)
    {
        Console.WriteLine(TotalCount);
    }
}

static int[] Ordering(int[] z)
{
    int[] r = new int[z.Length];
    r = z.OrderBy(x => x).ToArray();
    return r;
}
static int Index(int[] z,int integer)
{
    for (int intI = 0; intI < z.Length; intI++)
    {
        if(z[intI]== integer)
        {
            return intI;
        }
    }
    return 0;
}

Этот код работает нормально, но время его выполнения слишком велико. Я получаю "Прекращено из-за тайм-аута" в HackerRank. Тем не менее, решение отлично работает на локальном компьютере, но это занимает больше времени. Ссылка на проблему: https://www.hackerrank.com/challenges/new-year-chaos/problem.

Пример ввода

2 (количество тестовых случаев)

5 (количество человек в очереди)

2 1 5 3 4 (n разделенных пробелом целых чисел, описывающих конечное состояние очереди)

5 (количество человек в очереди)

2 5 1 3 4 (n разделенных пробелом целых чисел, описывающих конечное состояние очереди).

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

Выход 3

Слишком хаотично

Вопрос:

Как я могу уменьшить его время выполнения? В настоящее время я использую массив.

  • 0
    Я думаю, что StackOverflow не является правильной платформой для такого рода вопросов. Кроме того, нет описания того, что делает этот код. Я думаю, это было бы лучше подходит для CodeReview
  • 0
    Слишком много вложенных циклов. Вы можете по крайней мере избавиться от метода Index и использовать встроенный Array.IndexOf stackoverflow.com/a/6316165/10634638 stackoverflow.com/a/6316165/10634638
Показать ещё 1 комментарий
Теги:
c#-4.0
visual-studio-2015

1 ответ

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

Я решил это несколько недель назад, это мое решение проблемы (100%)

static void minimumBribes(int[] q) {
    int bribe = 0;
    bool chaotic = false;
    int n = q.Length;
    for(int i = 0; i < n; i++)
    {
        if(q[i]-(i+1) > 2)
        {               
            chaotic = true;
            break;     
        }
        for (int j = Math.Max(0, q[i]-1-1); j < i; j++)
            if (q[j] > q[i]) 
                bribe++;
    }
    if(chaotic)
        Console.WriteLine("Too chaotic");
    else
        Console.WriteLine(bribe);
}

Вам не нужны никакие другие методы, кроме тех, которые предусмотрены задачей

  • 6
    Что делает int j = Math.Max(0, q[i]-1-1); значит? Зачем ты это делаешь?
  • 0
    @ 425nesp начинайте с j как минимум 0. Избегайте отрицательного индекса
Показать ещё 3 комментария

Ещё вопросы

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