#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;
}
}
}
...
Чего мне здесь не хватает?