Как можно было бы захватить n уникальных элементов из массива в этих условиях ….?

#java #algorithm #dictionary #heap

#java #Алгоритм #словарь #Куча

Вопрос:

Краткие сведения


Я уже два дня пытаюсь помочь кому-то с этой проблемой, и хотя я могу перебирать ее с помощью вложенных циклов for, я пытаюсь упростить ее до двух не вложенных циклов.

Вот условия:

  • Используйте карту для хранения индекса первого появления элемента и количества появлений в массиве
  • Вызывающий метод должен иметь возможность указать первые N уникальных элементов для захвата
  • Не допускается иметь более 2 циклов, кроме того, они не должны быть вложенными

Моя попытка


 public  <E extends Comparable<E>> void getHeapUnique(E[] array, int n) {
        Map<Integer, Integer> map = new HashMap<>();
        PriorityQueue<Integer> heap = new PriorityQueue<>();
        int count = 0;
        boolean unique = true;

        for(int i = 0; i < array.length; i  )
        {
            // here is where I get stuck

        }

        for (Integer key : map.keySet())
        {
            if (count==2)
            {
                break;
            }

            if (map.get(key) == 1)
            {
                heap.add((Integer) array[key]);
                count  ;
            }
        }

        System.out.println(heap.toString());
    }
  

Вопросы


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

Мне специально сказали сохранить индекс первого появления чисел и количество появлений на карте. Мне также сказали не перебирать массив, а вместо этого карту. У меня нет проблем с этим, но моя проблема в том, что я могу только представить способ определения того, появился ли элемент уже, если я использую вложенный цикл для проверки каждого отдельного ключа в наборе ключей карты:

 ...
for (int i  = 0; i < arr.length;i  )
{
   boolean unique = true;

   for (Integer index : map.keySet())
   {
      if (arr[i] == arr[index])
      {
          unique = false;
          int incr = map.get(index)   1;
          map.put(index, incr);
          break;
      }
   }

   if (unique)
   {
      map.put(i, 1);
      count  ;
      if (count == n)
      {
         break;
      }
   }
}
...
  

Чего мне здесь не хватает?