I have tried to solve the leetcode problem using list and dictionary. it passes for a few test cases but fails for some due to the range(k) passes as a parameter. Is there a way I could take care of all edge cases leetcode link:https://leetcode.com/problems/top-k-frequent-elements/
My soln:
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
d={}
for each in range(len(nums)):
if nums[each] not in d:
d[nums[each]]=0
d[nums[each]] =1
res=[]
if len(d)==k:
return nums
l=sorted(d.values(),reverse=True)
for i in range(k):
for k,v in d.items():
if l[i]==v:
res.append(k)
return res
CodePudding user response:
Others have given some solutions. I'd like to point out some of the problems in your code:
- when
len(d) == k, we need to returnd.keys()instead ofnums.
For example, when the nums = [1,1,1,1] and k = 1, we just need to return [1] instead of [1,1,1,1].
- Try not to use variables with the same name.
We have a variable k in the input, and when iterating dict.items(), we don't want to create another variable named as k.
- Think about a test case:
nums = [1,2,2,3,3]
k = 2
Your code will return [2,3,2,3] instead of [2,3]. Because l=[2,2,1] and elements appearing twice (2,3) will be added twice. One possible way to solve is adding d[k] = -1 after res.append(k).
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
d={}
for each in range(len(nums)):
if nums[each] not in d:
d[nums[each]]=0
d[nums[each]] =1
res=[]
if len(d)==k:
return d.keys()
l=sorted(d.values(),reverse=True)
for i in range(k):
for k,v in d.items():
if l[i]==v:
res.append(k)
d[k] = -1
return res
CodePudding user response:
the easiest solution to this would be to just count all items in the list and then, sort by count, like this
def topKfrequent(nums, k):
d = dict()
for n in nums:
d[n] = d.setdefault(n, 0) 1
sortedNumsKeys = sorted(d.keys(), key=lambda x: d[x], reverse=True)
return sortedNumsKeys[:k]
CodePudding user response:
Another solution using collections.Counter:
from collections import Counter
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
return [i for i, _ in Counter(nums).most_common(k)]
CodePudding user response:
Soln:
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
d={}
for each in range(len(nums)):
if nums[each] not in d:
d[nums[each]]=0
d[nums[each]] =1
res=[]
if len(d)==k:
return d.keys()
l=sorted(d.values(),reverse=True)
for i in range(k):
for key,v in d.items():
if l[i]==v:
res.append(key)
d[key] = -1
return res
