Найти восходящие повторяющиеся пары в массиве

1

Учитывая массив A с нулевым индексом и N целыми числами, найдите одинаковые элементы с разными позициями в массиве. Пара индексов (P, Q) таких, что 0 <= P <Q <N таких, что A [P] = A [Q]. Мой алгоритм ниже, но я ищу решение O (N * logN).

    public int solution(int[] A)
    {
        int N = A.Length;            
        int count = 0;

        for (int j = 0; j < N; j++)
        {
            count += FindPairs(A[j], j, A);
        }

        return count;
    }

    public int FindPairs(int item, int ci, int[] A)
    {
        int len = A.Length;
        int counter=0;
        int k = ci+1;
        while (k < len)
        {
            if (item == A[k])
                counter++;
            k++;
        }
        return counter;
    }
  • 1
    Этот вопрос кажется не по теме, потому что он касается улучшения рабочего кода, который принадлежит codereview.stackexchange.com
  • 0
    Почему бы вам просто не вставить целые числа в хеш-таблицу или не использовать Enumerable.GroupBy (integer, x => x)? Эта проблема O (N).
Показать ещё 1 комментарий
Теги:
algorithm

3 ответа

1

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

Заметим, что если в A есть m вхождений числа x, то число восходящих двойных пар значения x равно m choose 2 или m (m - 1)/2.

Итак, суммируем m (m - 1)/2 для каждого единственного x, давая нам ответ.

В псевдокоде это выглядит так:

count = new Dictionary();
foreach a in A {
    count[a]++;
}
total = 0;
foreach key, value in count {
    total += value * (value - 1) / 2;
}
return total;

Этот алгоритм O(N).

0

Недавний вопрос интервью... вот что я сделал:

using System;
using System.Collections.Generic;
using System.Linq;

namespace Codility
{
    internal class Program
    {
        public struct Indice
        {
            public Indice(int p, int q)
            {
                P = p;
                Q = q;
            }

            public int P;
            public int Q;

            public override string ToString()
            {
                return string.Format("({0}, {1})", P, Q);
            }
        }

        private static void Main(string[] args)
        {
            //                      0 1 2 3 4 5 
            int[] list = new int[] {3,3,3,3,3,3};

            int answer = GetPairCount(list);

            Console.WriteLine("answer = " + answer);
            Console.ReadLine();
        }

        private static int GetPairCount(int[] A)
        {
            if (A.Length < 2) return 0;

            Dictionary<int, Dictionary<Indice, Indice>> tracker = new Dictionary<int, Dictionary<Indice, Indice>>();

            for (int i = 0; i < A.Length; i++)
            {
                int val = A[i];

                if (!tracker.ContainsKey(val))
                {
                    Dictionary<Indice, Indice> list = new Dictionary<Indice, Indice>();
                    Indice seed = new Indice(i, -1);
                    list.Add(seed, seed);
                    tracker.Add(val, list);
                }
                else
                {
                    Dictionary<Indice, Indice> list = tracker[val];

                    foreach (KeyValuePair<Indice,Indice> item in list.ToList())
                    {
                        Indice left = new Indice(item.Value.P, i);
                        Indice right = new Indice(i, item.Value.Q);

                        if (!list.ContainsKey(left))
                        {
                            list.Add(left, left);
                            Console.WriteLine("left= " + left);
                        }
                        if (!list.ContainsKey(right))
                        {
                            list.Add(right, right);
                            Console.WriteLine("\t\tright= " + right);
                        }
                    }
                }
            }


            return tracker.SelectMany(kvp => kvp.Value).Count(num => num.Value.Q > num.Value.P);
        }
    }
}
  • 0
    Проведенные тесты и мое решение быстро умерли, как заявил Эрик ... решение, предоставленное irrelephant, соответствовало моим результатам, а затем работало нормально для гораздо больших наборов ...
-3

Проверьте мою версию:

public int solution(int[] A)
{
    int N = A.Length;
    int count = 0;

    for (int j = 0; j < N - 1; j++)
        for (int i = j + 1; i < N; i++)
            if (A[i] == A[j])
                count++;

    return count;
}
  • 0
    Если что-то не так, пожалуйста, оставьте комментарий. Всем, кто проголосовал против, пожалуйста, будьте любезны объяснить, что не так.
  • 0
    Ваше решение O (n ^ 2). У ОП уже есть код такой сложности. Он ищет O (n log n).

Ещё вопросы

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