首页 > 其他 > 详细

leetcode540

时间:2019-02-25 21:55:11      阅读:181      评论:0      收藏:0      [点我收藏+]

这道题目的要求,Note: Your solution should run in O(log n) time and O(1) space.

因此应该用二分查找的方式,代码如下:

 1 class Solution:
 2     def singleNonDuplicate(self, nums: List[int]) -> int:
 3         l = 0
 4         h = len(nums)-1        
 5         while l<h:
 6             m = l + (h-l)//2
 7             if m%2==1:
 8                 m-=1
 9             if nums[m] == nums[m+1]:
10                 l = m+2
11             else:
12                 h = m
13         return nums[l]

52ms,13.8mb

 

传统的方式,就是已经两次遍历,先遍历一遍数组,记录每一个值出现的次数,存储到一个字典中。

然后再遍历一次字典,找到只出现一次的那个值,代码如下:

1 class Solution:
2     def singleNonDuplicate(self, nums: List[int]) -> int:
3         count = {}
4         for num in nums:
5             count[num] = count.get(num, 0)+1  
6         for key in count:
7             if count[key] == 1:
8                 return key

48ms,14.5mb

这种方式想法很简单也很容易懂,但是需要额外的空间。但奇怪的是其执行时间却比二分查找的要快,感觉可能是测试集的样本问题。

 

还有一种技巧性比较强的方式,空间复杂度满足要求,但是时间复杂度应该更高:

1 class Solution:
2     def singleNonDuplicate(self, nums: List[int]) -> int:
3         res = nums[0]
4         for i in range(1,len(nums)):
5             res ^= nums[i]
6         return res

60ms,14mb

最后贴上三种方法的执行结果,从上倒下分别是第三种,第二种和第一种,这种不对称就是破除强迫症的排版(其实是我比较懒)

技术分享图片

leetcode540

原文:https://www.cnblogs.com/asenyang/p/10433672.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!