Я думаю, что сделать это в O (1) пространстве и O (n) времени будет сложно, если вы не сделаете некоторые предположения, как предлагали некоторые другие ответы.Я не думаю, что выделение массива длины MAXINT - действительно правильный выбор.
Ответ в пространстве O (количество уникальных значений) и O (n) намного проще.Используйте хеш, где ключ - это значение из массива, а хеш-значение - это количество.У вас будет один проход через ваши данные, а затем у вас будет хеш с полными счетами.
HashMap<Integer,Integer> map.= new HashMap<Integer,Integer>();
for (int value: array) {
Integer valueI = new Integer(value);
if (!map.hasKey(valueI)) {
Integer count = new Integer(1);
map.put(valueI, count);
}
else {
Integer oldCount = map.get(valueI);
Integer newCount = new Integer(oldCount.intValue() + 1);
map.put(valueI, count);
}
}
Что-то в этом роде.Ключи вашей карты содержат уникальные значения и значения для каждой карты ключей, которые учитываются.
Я не могу придумать что-либо, что вы можете сделать в пространстве O (1), не делая огромных предположений относительно данных, иливыделение действительно огромного массива.В конце концов, вы должны где-то хранить результаты.