轉載本文章請標明作者和出處
本文出自《愛喝純淨水的南榮牧歌》
本文題目和部分解題思路來源自《劍指offer》第二版
題目
找出數組中重複的數字。
在一個長度爲 n 的數組 nums 裏的所有數字都在 0~n-1 的範圍內。數組中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出數組中任意一個重複的數字;
- 示例1
輸入:
[2, 3, 1, 0, 2, 5, 3]
輸出:2 或 3
解題分析
如果這道題真的在面試中被問到了,一定要問面試官一個問題,對空間複雜度有沒有要求,能不能修改原來的結構;
如果面試官說不可以修改數據結構的話,並且空間複雜度可以爲O(n)的話,那麼這裏就要使用哈希表了;
- 遍歷整個數組,查看該元素在哈希表中(java中使用HashSet,Python中使用set())有沒有該元素,有的話直接返回,沒有的話將這個元素放到哈希表中;
但是題目中指定了一個條件,所有數字都在 0~n-1 的範圍內,所以我猜面試官應該是想要一種可以修改原數據結構並且空間複雜度可以爲O(n)的算法,下標定位算法;
- 我們遍歷這個數組,假設當前元素的索引是m,索引所在的元素的值是n,那麼我們就要判斷m和n是否相等,如果不相等的話,我們就要找到索引爲n所在的元素,如果人家索引爲n的值本來就是n我們就定爲到了重複的數字,返回即可,如果索引爲n的值不爲n是x,那麼我們就把索引n的值置爲n,再把元素x放到索引x所在的位置上去;
代碼
ps:這裏筆者使用的python3.7
-
哈希表
class Solution: def findRepeatNumber(self, nums: List[int]) -> int: if nums is None or len(nums) == 0: return -1 nums_set = set() for num in nums: if num in nums_set: return num else: nums_set.add(num)
-
下標定位法
class Solution: def findRepeatNumber(self, nums: List[int]) -> int: if nums is None or len(nums) == 0: return -1 for i in range(len(nums)): if nums[i] != i and nums[nums[i]] == nums[i]: return nums[i] elif nums[i] != i and nums[nums[i]] != nums[i]: nums[nums[nums[i]]] = nums[nums[i]] nums[nums[i]] = nums[i]