前面介绍过用Counter函数来寻找数组中重复元素的数量,但是有些问题无法使用Counter,字典也可以解决这类问题。
697. 数组的度
给定一个非空且只包含非负数的整数数组 nums, 数组的度的定义是指数组里任一元素出现频数的最大值。
你的任务是找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。
输入: [1, 2, 2, 3, 1]
输出: 2
解释:
输入数组的度是2,因为元素1和2的出现频数最大,均为2.
连续子数组里面拥有相同度的有如下所示:
[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]
最短连续子数组[2, 2]的长度为2,所以返回2.
思路:
- 遍历nums,先以字典形式记录每个不重复元素以及它们相对应的index
- 遍历该字典,再以拥有最多index的元素作为nums的度
- 遍历字典,如果该元素的index数量等于nums的度,利用该元素的首尾index计算这个子集的长度,找最小长度
#用dict记录nums中每个元素出现的位置,
#度为出现位置最多的len,返
#回拥有相同度的元素中,min(首末位置最+1)
class Solution(object):
def findShortestSubArray(self, nums):
a={}
for i in range(len(nums)):
if nums[i] not in a:
a[nums[i]]=[i]
else:
a[nums[i]].append(i)
m=0
for i in a:
m=max(m,len(a[i]))
r=len(nums)
for i in a:
if len(a[i])==m:
r=min(r,a[i][-1]-a[i][0]+1)
return r
217. 存在重复元素
下面这个问题用字典速度其实不如Counter,但很适合用来举例
给定一个整数数组,判断是否存在重复元素。
如果任意一值在数组中出现至少两次,函数返回 true
。如果数组中每个元素都不相同,则返回 false
。
输入: [1,2,3,1]
输出: true
输入: [1,2,3,4]
输出: false
输入: [1,1,1,3,3,4,3,2,4,2]
输出: trues
思路一:
- 第一次遍历找出所有不重复元素,以字典形式
- 再次遍历,看字典中有无数组长度>1的元素
class Solution:
def containsDuplicate(self, nums: List[int]) -> bool:
a={}
for i in range(len(nums)):
if nums[i] not in a:
a[nums[i]]=[i]
else:
a[nums[i]].append(i)
for i in a:
if len(a[i])>1: return True
return False
思路二:
利用Counter
from collections import Counter
class Solution:
def containsDuplicate(self, nums: List[int]) -> bool:
a=Counter(nums)
for i in a:
if a[i] >=2:
return True
return False