解决之路= =
题目描述
测试案例(部分)
第一次
关键就是看是否有重复元素,暴力解法就是双循环,然后有相同元素就返回True
,否则就等循环结束,返回False
。
但是自己想到了另一个只需要一个循环的解法。用一个循环来确定一个元素,然后通过切片,在后面的元素中查找是否存在这个元素。如果存在,那就是重复了,返回True
;反之,就循环结束,返回False
。
class Solution(object):
def containsDuplicate(self, nums):
for k, v in enumerate(nums):
if v in nums[k + 1:]:
return True
return False
测试正确,提交,通过了,不过。。。怎么耗时这么长?
第二次
难道还是用nb的双指针?试了试,感觉是不行的。如果left和right两头按比大小的规则左右移动,就可能会导致漏相同的元素。
感觉还是要延续第一次代码的思路,第一次是用元素往后面的所有元素中找是否相同,这样比较费时间。在试双指针的时候,自己想到了到底是排序过后再用还是不用排序直接用,那么,结合第一次的思路,我先将输入序列排序,然后每次循环选中的元素,和下一位元素进行对比,如果相同就返回True
,如果整个循环结束,都没有相同,就返回False
。这样,就不用in
来判断子列表中是否有元素相同了。
class Solution(object):
def containsDuplicate(self, nums):
nums.sort()
for i in range(len(nums) - 1):
if nums[i] == nums[i + 1]:
return True
return False
测试正确,提交,通过了,时间确实降下来了。
第三次
感觉画的时间可能还能降,翻一翻万能的评论区。
哎哟,我傻了,看到了一个C++老哥用集合set来解决。对啊,用集合的去重思路来解决确实是一种思路。不多说了,立马实现一下试试。
class Solution(object):
def containsDuplicate(self, nums):
nums_set = set(nums)
if len(nums_set) != len(nums):
return True
else:
return False
测试正确,提交,通过了,真的时间更短。
闲话
后续又看到一个老哥,把我写的这个逻辑简化成了一行代码。
牛,但是提交测试了一下,画的时间和自己第三次的代码一样。
还看到一只“派蒙”写了和我第二次一样的代码逻辑,虽然是用java写的,但这个if(nums[i]==nums[i+1])
一看就和我不谋而合,哈哈哈哈,有缘呀。
附件
昨天本来剩一半单词打算床上背的,结果洗漱完就忘了。。。
今天补上