首页 > 代码库 > Leetcode Find the Duplicate Number
Leetcode Find the Duplicate Number
最容易想到的思路是新开一个长度为n的全零list p[1~n]。依次从nums里读出数据,假设读出的是4, 就将p[4]从零改成1。如果发现已经是1了,那么这个4就已经出现过了,所以他就是重复的那个数。这个解法的时间复杂度是O(N)。但是由于本题要求空间复杂度是O(1)。所以不能用。
可以用二分法,low = 1, high = n, mid = (left + right)//2,如果<=mid 的元素个数 > mid,那么重复的数字一定在[1, mid]区间内。反之,则一定在[mid+1, high]里面。注意红色的>mid不能是>=。
例如 【1,2, 2, 3(mid), 4, 5, 6】,【1,2, 3, 3(mid), 4, 5】
1 class Solution(object): 2 def findDuplicate(self, nums): 3 """ 4 :type nums: List[int] 5 :rtype: int 6 """ 7 left = 1 8 right = len(nums) - 1 9 10 while left < right: 11 mid = (left + right)//2 12 count = 0 13 for x in nums: 14 if x <= mid: 15 count += 1 16 17 if count > mid: 18 right = mid 19 else: 20 left = mid + 1 21 22 return left
第二种解法来自:http://www.cnblogs.com/grandyang/p/4843654.html
使用类似Linked List Cycle II的思路。
1 def findDuplicate(self, nums): 2 """ 3 :type nums: List[int] 4 :rtype: int 5 """ 6 slow = 0 7 fast = 0 8 t = 0 9 while True: 10 slow = nums[slow] 11 fast = nums[nums[fast]] 12 if slow == fast: 13 break 14 while True: 15 slow = nums[slow] 16 t = nums[t] 17 if slow == t: 18 break 19 return slow
Leetcode Find the Duplicate Number
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。