10003. Counting Elements
Решение задачи 10003 “Counting Elements” с LeetCode.
Условие задачи
Given an integer array arr, count element x such that x + 1 is also in arr.
If there’re duplicates in arr, count them seperately.
Constraints:
1 <= arr.length <= 10000 <= arr[i] <= 1000
Данн массив целых чисел arr. подсчитать количество таких элементов x, для которых в массиве существуют элементы x+1. Если такой элемент x встречается несколько раз - считать каждый отельно.
ограничения
1 <= arr.length <= 10000 <= arr[i] <= 1000
пример
Input: arr = [1,2,3]
Output: 2
Объяснение:1 и 2 учтены, поскольку для них существют 2 и 3 соотвественно.Input: arr = [1,1,3,3,5,5,7,7]
Output: 0
Объяснение: Ни одно число не учтено, посколько в массиве нет 2,4,6 и 8.Input: arr = [1,3,2,3,5,0]
Output: 3
Объяснение:0, 1 и 2 учтены, поскольку 1, 2 и 3 есть в массиве.Input: arr = [1,1,2,2]
Output: 2
Объяснение: две идиницы учтены, потому что есть 2.Решение
Использовать коллекцию
Идея алгоритма:
Создать коллекцию, где ключом будет число, а значение - кол-во раз вхождения числа в исходный массив.
Идем по исходному массиву и пересчитываем все числа.
Идем по коллекции, берем текущее число. Если в коллекции есть значения для текущего числа + 1 - то плюсуем к результату кол-во исходных чисел.
func countElements(arr []int) int {
if len(arr) == 0 {
return 0
}
res := 0
up := make(map[int]int,0)
for idx := range arr {
up[arr[idx]]++
}
for jdx:= range up {
if _, ok := up[jdx+1]; ok {
res+=up[jdx]
}
}
return res
}Сортировка с пересчетом
Идея алгоритма:
Отсортировать исходный массив
Идти по элементам, считать кол-во текущих элементов ( то есть сколько раз повторяется число ).
Как только встретили новое число
- если оно больше более чем на 1 - сбросить счетчики и считать заново
- если оно больше ровно на 1 - добавить к итоговому результату кол-во текущих элементов и обнулить их счетчик.
func countElements(arr []int) int {
if len(arr) == 0 {
return 0
}
sort(arr)
res := 0
cur :=0
curv:=arr[0]
prev := 0
for idx := range arr {
if arr[idx]>curv && arr[idx]-curv > 1 {
prev = 0
cur = 0
curv = arr[idx]
}
if arr[idx]>curv && arr[idx]-curv == 1 {
prev = cur
cur = 0
curv = arr[idx]
}
if arr[idx] == curv {
cur++
if prev>0 {
res+=prev
prev = 0
}
}
}
return res
}
func sort(arr []int) {
for idx:=range arr{
k := idx
for jdx:=idx;jdx>=0;jdx -- {
if arr[jdx]>arr[k]{
arr[jdx],arr[k] = arr[k],arr[jdx]
k = jdx
}
}
}
}