题目
注意!题目要求:你设计的解决方案必须满足 O(log n) 时间复杂度和 O(1) 空间复杂度。
示例 1:
输入: nums = [1,1,2,3,3,4,4,8,8]
输出: 2
示例 2:
输入: nums = [3,3,7,7,10,11,11]
输出: 10
提示:
1 <= nums.length <= 105
0 <= nums[i] <= 105
前面这两种方法虽然可以得到正确的结果,但是都不满足题目所说的时间复杂度,第三种方法满足
【代码】
执行用时:68 ms, 在所有 Python3 提交中击败了5.60% 的用户
内存消耗:21.3 MB, 在所有 Python3 提交中击败了31.37% 的用户
通过测试用例:15 / 15
class Solution:
def singleNonDuplicate(self, nums: List[int]) -> int:
for idx,item in enumerate(nums):
if (idx^1)>=len(nums) or item!=nums[idx^1] :
return item
return -1
【方法2】
执行用时:56 ms, 在所有 Python3 提交中击败了9.91% 的用户
内存消耗:21.1 MB, 在所有 Python3 提交中击败了92.84% 的用户
通过测试用例:15 / 15
class Solution:
def singleNonDuplicate(self, nums: List[int]) -> int:
idx=0
n=len(nums)
while idx<n:
if (idx^1)>=n or nums[idx]!=nums[idx^1] :
return nums[idx]
idx+=2
return -1
【方法3】二分法
执行用时:44 ms, 在所有 Python3 提交中击败了53.13% 的用户
内存消耗:21.2 MB, 在所有 Python3 提交中击败了63.68% 的用户
通过测试用例:15 / 15
class Solution:
def singleNonDuplicate(self, nums: List[int]) -> int:
left,right=0,len(nums)-1
while left<right:
mid=left+(right-left)//2
if nums[mid^1]==nums[mid]:
left=mid+1
else:
right=mid
return nums[left]