leetcode 217 存在重复元素
给定一个整数数组,判断是否存在重复元素。
如果任意一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。
示例:
输入: [1,2,3,1]
输出: true
输入: [1,2,3,4]
输出: false
解题思路:
一共有三种方法,分别是字典法,排序法和set集合法。
字典法
遍历列表,把元素依次放入字典中,数值作为key。在前面添加一个判断元素是否在字典内,如果是则返回True,若遍历完列表还是没有返回,则返回False。
排序法
对列表排序,循环列表,根据下标判断 nums[i] == nums[i+1]
,如果有就返回true,否则false
集合法
直接判断列表长度与被转成集合的列表的长度是否相等,如果相等,则返回false,不相等返回true
代码思路:
需要注意添加判空条件。列表的排序只能用sorted()
代码:
字典法
if len(nums) == 0:
return False
new_dict = dict()
for i,j in enumerate(nums):
if j in new_dict:
return True
new_dict[j] = i
return False
排序法
if len(nums) == 0:
return False
nums = sorted(nums)
for i in range(len(nums)-1):
if nums[i] == nums[i+1]:
return True
return False
集合法
if len(nums) == 0:
return False
return not len(nums) == len(set(nums))
复 杂 度 分 析 : \color{red}{复杂度分析:} 复杂度分析:
字典法需要遍历列表,所以时间复杂度为O(N),字典法需要存储N个元素,所以是O(N)。
排序法的时间复杂度为O(NlogN),这是排序的最快速度,空间复杂度为O(1)
集合法的时间复杂度为O(N),因为转换set需要遍历一次,空间复杂度是O(N),也是因为set的存储空间