存在重复元素(描述一):
给定一个整数数组,判断是否存在重复元素。如果任何值在数组中出现至少两次,函数返回 true;如果数组中每个元素都不相同,则返回 false。
示例 1:
输入: [1,2,3,1] 输出: true
示例 2:
输入: [1,2,3,4] 输出: false
示例 3:
输入: [1,1,1,3,3,4,3,2,4,2] 输出: true
解法一:
思想:先对数组排序;再对数组进行遍历判断是否有重复
class Solution: def containsDuplicate(self, nums): """ :type nums: List[int] :rtype: bool """ n = sorted(nums) L = len(n) i = 0 while i < L - 1: if n[i] == n[i+1]: return True i += 1 return False
解法二:
1.set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。
2.这种做法的思想就是插入法判断数组有重复
class Solution: def containsDuplicate(self, nums): k = set() for i in nums: if i in k: return True else: k.add(i) return False
存在重复元素(描述二):
给定一个整数数组和一个整数 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
方法一:
用两层循环暴力解决更本通不过,leetcode一共用了23组数据去测试,第22组数据大约有10万个数据,时间复杂度太高因此通不过。
class Solution: def containsNearbyDuplicate(self, nums, k): """ :type nums: List[int] :type k: int :rtype: bool 两层循环 """ i = 0 j = i+1 MIN = 10000 while i < len(nums): while j < len(nums): if nums[i] == nums[j]: MIN = abs(i-j) if MIN <= k: return True j += 1 i = i + 1 j = i+1 return False
方法二:
1.利用python中的字典来减少一层循环
2.当字典中没有此时遍历的元素,则加入字典
3.当字典中有此时遍历的元素,则对其索引下标做差,算出绝对值,再与k进行比较
class Solution: def containsNearbyDuplicate(self, nums, k): """ :type nums: List[int] :type k: int :rtype: bool 1层循环+字典 """ Dict = {} for i in range(len(nums)): if nums[i] in Dict: if i-Dict[nums[i]] <= k: return True Dict[nums[i]] = i return False
存在重复元素(描述三):
给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 k。
示例 1:
输入: nums = [1,2,3,1], k= 3, t = 0 输出: true
示例 2:
输入: nums = [1,0,1,1], k=1, t = 2 输出: true
示例 3:
输入: nums = [1,5,9,1,5,9], k = 2, t = 3 输出: false