Для массива:
int arr[]= {1, 2, 3, 2, 3, 1, 3}
Вам предлагается найти число в массиве, которое встречается нечетное количество раз. Это 3 (встречается 3 раза). Временная сложность должна быть не менее O (n). Решение - использовать HashMap
. Элементы становятся ключами , а их счетчиками становятся значениями хэш-карты.
// Code belongs to geeksforgeeks.org
// function to find the element occurring odd
// number of times
static int getOddOccurrence(int arr[], int n)
{
HashMap<Integer,Integer> hmap = new HashMap<>();
// Putting all elements into the HashMap
for(int i = 0; i < n; i++)
{
if(hmap.containsKey(arr[i]))
{
int val = hmap.get(arr[i]);
// If array element is already present then
// increase the count of that element.
hmap.put(arr[i], val + 1);
}
else
// if array element is not present then put
// element into the HashMap and initialize
// the count to one.
hmap.put(arr[i], 1);
}
// Checking for odd occurrence of each element present
// in the HashMap
for(Integer a:hmap.keySet())
{
if(hmap.get(a) % 2 != 0)
return a;
}
return -1;
}
Я не понимаю, почему эта общая операция занимает O (N) временная сложность. Если подумать, только l oop требует O (N) временной сложности. Эти hmap.put
(операция вставки) и hmap.get
(операции поиска) принимают O (N) , и они вложены в l oop. Обычно я думаю, что эта функция занимает O (N ^ 2) раз. Почему вместо этого требуется O (N) ?.