今天的题又是个系列题呢
存在重复元素
给定一个整数数组,判断是否存在重复元素。
如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。
简单题我重拳出击!
class Solution:
def containsDuplicate(self, nums: List[int]) -> bool:
return len(nums) != len(set(nums))
集合中不会出现重复元素,因此将列表转化为集合,只要转化前后长度相同,则无重复元素,返回false;反之,返回true。
存在重复元素Ⅱ
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。
再次重拳出击嘿嘿嘿
class Solution:
def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
length = len(nums)
index = {}
for i in range(length):
if nums[i] in index and index[nums[i]] >= i-k:
return True
index[nums[i]] = i
return False
需要用上哈希表,遍历每个元素,先看看之前有没有出现过,出现过的话比较一下距离,小于k则返回true,不满足则将其存入或者更新到index哈希表中。遍历完都没找到那就是没有,返回false。
存在重复元素Ⅲ
给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] - nums[j]) <= t ,同时又满足 abs(i - j) <= k 。
如果存在则返回 true,不存在返回 false。
这个题目就取得很有问题啊,请问重复元素在哪?这根本没有重复元素判断啊!(╯‵□′)╯︵┻━┻
好吧,不怪题目了,let me think think…
class Solution:
def containsNearbyAlmostDuplicate(self, nums: List[int], k: int, t: int) -> bool:
length = len(nums)
for i in range(length):
for j in range(1, k+1):
if i+j <length and abs(nums[i] - nums[i+j]) <= t:
return True
return False
暴力解法永不过时哈哈,结果一个大数据集且k=1000就给我干超时了。。。
好啦,接下来就让我们看看大佬们是怎么解决这个问题的吧!
from sortedcontainers import SortedList
class Solution:
def containsNearbyAlmostDuplicate(self, nums: List[int], k: int, t: int) -> bool:
window = SortedList()
for i in range(len(nums)):
if i > k:
window.remove(nums[i-1-k])
window.add(nums[i])
pos = bisect.bisect_left(window, nums[i])
if pos>0 and abs(window[pos] - window[pos-1])<=t:
return True
if pos<len(window)-1 and abs(window[pos+1] - window[pos])<=t:
return True
return False
居然要用上红黑树?!!!
现在懒得很,以后再去好好学学这个如雷贯耳的结构吧。。。