时间:2020-6-10
题目地址:https://leetcode-cn.com/problems/contains-duplicate-ii/
题目难度:Easy
题目描述:
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。
示例 1:
输入: nums = [1,2,3,1], k = 3
输出: true
示例 2:
输入: nums = [1,0,1,1], k = 1
输出: true
示例 3:
输入: nums = [1,2,3,1,2,3], k = 2
输出: false
思路1:使用额外的数据结构,字典哈希存储索引并遍历找到小于等于k的
代码段1:通过
class Solution:
def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
temp = {}
number = 0
for i in nums:
if i in temp:
temp[i].append(number)
number +=1
else:
temp[i] = [number]
number +=1
print(temp)
for j in temp.values():
if type(j) == list:
for o in range(len(j) - 1):
if(j[o+1] - j[o] <= k):
return True
return False
总结:
- 字典真香,得好好用起来
- 看下优化的代码,其实不需要存储所有的索引后遍历,只需要边遍历边判断即可
class Solution:
def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
temp = {}
for index, num in enumerate(nums):
if num in temp and index - temp[num] <= k:
return True
temp[num] = index
return False
思路2:使用counter哈希进行统计
代码段2:通过
from collections import Counter
class Solution:
def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
temp = Counter(nums)
for i in temp.items():
if i[1] >= 2:
temp2 = []
num = i[0]
for index, j in enumerate(nums):
if j == num:
temp2.append(index)
for i in range(len(temp2) - 1):
if(temp2[i+1] - temp2[i] <= k):
return True
return False
总结:
- collection真香
- 下边的是优化的,6天前的空间能到100%,现在已经是50%
- 1e6 = 1*10^6
from collections import Counter
class Solution:
def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
liabs = 1e6
temp = Counter(nums)
for key in temp:
if temp[key] >= 2:
temp2 = []
for i in range(len(nums)):
if nums[i] == key:
temp2.append(i)
for j in range(1, len(temp2)):
liabs = min(liabs, temp2[j] - temp2[j - 1])
if(liabs <= k):
return True
return False