• leetcode540


    这道题目的要求,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

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

  • 相关阅读:
    深港DJ好听的歌曲
    电调的相关知识
    CAD画图技巧经验
    第一期周二航拍视频分享 2017/07/10
    网站资料
    如何读懂零件图
    航拍技巧经验总汇
    乐迪AT9
    机器学习、数据挖掘、计算机视觉等领域经典书籍推荐
    Eclipse调试Java程序技巧
  • 原文地址:https://www.cnblogs.com/asenyang/p/10433672.html
Copyright © 2020-2023  润新知