Add solution for neetcode arrays task

This commit is contained in:
pro100ton 2025-02-05 22:08:59 +03:00
parent 76a64a17fd
commit 217b953b70

View file

@ -0,0 +1,110 @@
##################### Section ##############################
# Section topic: Arrays and hashing
# Task name: Top K Frequent Elements
# Task:
# Given an integer array nums and an integer k, return the k most frequent
# elements within the array.
#
# The test cases are generated such that the answer is always unique.
#
# You may return the output in any order.
#
# Example 1:
#
# Input: nums = [1,2,2,3,3,3], k = 2
#
# Output: [2,3]
# Example 2:
#
# Input: nums = [7,7], k = 1
#
# Output: [7]
# Constraints:
#
# 1 <= nums.length <= 10^4.
# -1000 <= nums[i] <= 1000
# 1 <= k <= number of distinct elements in nums.
############################################################
##################### Section ##############################
# Section topic: Мой ход мыслей
# Заход 1
# Допустим возьмем простой массив, где в качестве индекса будет кол-во раз, которое
# встречается число в массиве nums
#
# Пример для первого кейса:
# cout = [0,1,2,3,4,5,6,7,8,9,...]
# 0,1,2,3,0,0,0,0,0,0,...
#
# Пример для второго кейса:
# cout = [0,1,2,3,4,5,6,7,8,9,...]
# 0,0,0,0,0,0,0,2,0,0,...
#
# Пример для неотсортированного массива
# nums = [4,1,2,5,5,2,3,1,6,3,2,0]
#
# cout = [0,1,2,3,4,5,6,7,8,9,...]
# 1,2,3,2,1,2,1,0,0,0,...
#
# => Заход не рабочий
#
# Заход 2
# Допустим будем хранить кол-во повторений в словаре, тогда на после первого
# просчета будем иметь:
#
# Первый случай:
# {1: 1, 2: 2, 3: 3}
#
# Второй случай:
# {7: 2}
#
# Получив такие словари берем, создаем массив с длиной len(nums) и заполненный нулями
# len(nums) = 6 => res = [[0],[0],[0],[0],[0],[0],[0]]
#
# {1: 1} => res[1].append(1)
# {2: 2} => res[2].append(2)
# {3: 3} => res[3].append(3)
#
#
# res = [[0],[1],[2],[3],[0],[0],[0]]
#
# Для семерок не интересно, попробуем для третьего примера первого кейса:
# nums = [4,1,2,5,5,2,3,1,6,3,2,0]
#
#
# Начинаем итерацию по полученному словарю
# {4: 1, 1: 2, 2: 3, 5: 2, 3: 2, 6: 1, 0: 1}
# res = [[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[0]]
#
# {4:1} => res[1].append(4)
# {1:2} => res[2].append(1)
# {2:3} => res[3].append(2)
# {5:2} => res[2].append(5)
# {3:2} => res[2].append(3)
# {6:1} => res[1].append(6)
# {0:1} => res[1].append(0)
############################################################
from typing import List
from collections import defaultdict
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
ic = defaultdict(int)
for n in nums:
ic[n] += 1
res = [[] for _ in range(0, len(nums)+1)]
for num,count in ic.items():
res[count].append(num)
return [item for sublist in res for item in sublist][-k:]
if __name__ == "__main__":
s = Solution()
nums = [7,7]
# nums = [1,2,2,3,3,3]
# nums = [4,1,2,5,5,2,3,1,6,3,2,0]
k = 1
print(s.topKFrequent(nums, k))