寻找重复数字类型的题目的思路探讨与源码
本次将三道题放到一起讲,它们的题目分别如下图,该3道题都属于数组类的题目,主要考察对于重复数字的理解,如何在列表中寻找找到重复数字并返回是核心。通过考虑转换列表为KV形式的字典,形成Key为原始值、Value为出现次数值。最终直接按value值的频数进行筛选后,返回重复数据即可。该3题虽然属于中级难度但是解决思路较简单并且思路几乎完全一样。
本人在做到这三题后,认为需要将list转为KV形式的字典,然后直接根据出现次数筛选即可,三者的代码几乎一样,唯一的区别是求众数II这个题目要首先求得n/3的值作为筛选条件,其他两道题的筛选条件直接设定为1即可,筛选完进行返回。代码如下所示:
#喷火龙与水箭龟
#求众数II
class Solution:
def majorityElement(self, nums: List[int]) -> List[int]:
from collections import Counter
numLen=int(len(nums)/3)
numDict = dict(Counter(nums))
res=[key for key,value in numDict.items()if value > numLen]
return res
#喷火龙与水箭龟
#寻找重复数
class Solution:
def findDuplicate(self, nums: List[int]) -> int:
from collections import Counter
ac = dict(Counter(nums))
resU=[key for key,value in ac.items()if value > 1]
res=resU[0]
return res
#喷火龙与水箭龟
#数组中重复的数据
class Solution:
def findDuplicates(self, nums: List[int]) -> List[int]:
from collections import Counter
ga = dict(Counter(nums))
res=[key for key,value in ga.items()if value > 1]
return res
在上述代码中,代码的逻辑是一样的,都是引入Counter后,将nums列表转化为dict字典形式,然后对value值进行过滤,最后通过遍历整个字典并进行筛选后,得到最终的结果并返回。需要注意的是,本代码是作者在leetcode运行的代码,如需使用请注意缩进等细节。
最终结果分别按顺序排列(求众数II+寻找重复数+数组中重复数据)如下:
从结果来说感觉速度还行,但是应该可以进一步提速,希望朋友们能够多多指教,非常感谢。