Python学习之妙用字典类型

举报
悦来客栈的老板 发表于 2020/12/29 00:21:49 2020/12/29
【摘要】 从一道leetcode题目说起,题目链接: https://leetcode.com/problems/contains-duplicate-ii/ 题目描述如图: 题目很简单,理解起来也很容易,给定一个数据nums,判断是否存在这样的k索引i和j,使得nums[i] == nums[j] 且 j - i >= k,nums,k为给定的值,0<=...

从一道leetcode题目说起,题目链接:

https://leetcode.com/problems/contains-duplicate-ii/

  

题目描述如图:

题目很简单,理解起来也很容易,给定一个数据nums,判断是否存在这样的k索引i和j,使得nums[i] == nums[j] 且 j - i >= k,nums,k为给定的值,0<=i<=j < length,理解意思之后很容易就写出这样的代码:


   
  1. class Solution:
  2. def containsNearbyDuplicate(self, nums, k):
  3. """
  4. :type nums: List[int]
  5. :type k: int
  6. :rtype: bool
  7. """
  8. for i in range(len(nums)):
  9. if nums[i] in nums[i+1:i+k+1]:
  10. return True
  11. return False

我这里的思路就是直接判断 nums[i] 这个值是否在 切片数组nums[i+1:i+k+1]里面,存在则返回True,不存在则返回False,因为Python列表切片不涉及到越界的问题,所以不用去判断数组(列表)长度。

也许你会想,这也太简单了,满怀欣喜的提交,却发现 超时了。

啊。。。。。。。。。这样的是不行的,无法通过测试,那只能换一种思路了。

我们知道,Python中list对象的存储结构采用的是线性表,采用 in 这样的方式查询元素的时间复杂度是 O(n),上面的程序总的时间复杂度是O(n*k)(n表示数组长度),因此在给定的数组比较大时,会导致超时,其消耗的时间也就在于查询元素。

那有没有更快的方式的呢?有的,我们可以使用 字典类型,它查询元素的时间在最优的情况下可以达到O(1),也就是基本不用花什么时间就能取得元素。那这样整体换算下来,程序的时间就只有O(n)

思路:新建一个字典类型,用key来保存 数组元素值,用value来保存索引值,类似哨兵的效果,即查询到元素在字典中存在时,这时新的索引减去旧的索引,如果小于给定的K值,则返回True,否则更新元素的索引值,直到访问完所有元素,代码如下:


   
  1. class Solution(object):
  2. def containsNearbyDuplicate(self, nums, k):
  3. """
  4. :type nums: List[int]
  5. :type k: int
  6. :rtype: bool
  7. """
  8. d = {}
  9. for i,num in enumerate(nums):
  10. if num in d:
  11. if i - d[num] <= k:
  12. return True
  13. d[num] = i
  14. return False

再次提交,Accepted了,再也不会超时了,而且还发现这种方法居然打败了99.95%的用户。赞!

Python真是一门不掉头发的语言啊!

文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq523176585/article/details/109508027

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。