funcrepeatedNTimes(nums []int)int { found := map[int]bool{} for _, num := range nums { if found[num] { return num } found[num] = true } return-1// 不可能的情况 }
[sol1-JavaScript]
1 2 3 4 5 6 7 8 9 10 11
var repeatedNTimes = function(nums) { const found = newSet(); for (const num of nums) { if (found.has(num)) { return num; } found.add(num); } // 不可能的情况 return -1; };
复杂度分析
时间复杂度:O(n)。我们只需要对数组 nums 进行一次遍历。
空间复杂度:O(n),即为哈希集合需要使用的空间。
方法二:数学
思路与算法
我们可以考虑重复的元素 x 在数组 nums 中出现的位置。
如果相邻的 x 之间至少都隔了 2 个位置,那么数组的总长度至少为:
n + 2(n - 1) = 3n - 2
当 n > 2 时,3n-2 > 2n,不存在满足要求的数组。因此一定存在两个相邻的 x,它们的位置是连续的,或者只隔了 1 个位置。
当 n = 2 时,数组的长度最多为 2n = 4,因此最多只能隔 2 个位置。
这样一来,我们只需要遍历所有间隔 2 个位置及以内的下标对,判断对应的元素是否相等即可。
代码
[sol2-C++]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
classSolution { public: intrepeatedNTimes(vector<int>& nums){ int n = nums.size(); for (int gap = 1; gap <= 3; ++gap) { for (int i = 0; i + gap < n; ++i) { if (nums[i] == nums[i + gap]) { return nums[i]; } } } // 不可能的情况 return-1; } };
[sol2-Java]
1 2 3 4 5 6 7 8 9 10 11 12 13 14
classSolution { publicintrepeatedNTimes(int[] nums) { intn= nums.length; for (intgap=1; gap <= 3; ++gap) { for (inti=0; i + gap < n; ++i) { if (nums[i] == nums[i + gap]) { return nums[i]; } } } // 不可能的情况 return -1; } }
[sol2-C#]
1 2 3 4 5 6 7 8 9 10 11 12 13 14
publicclassSolution { publicintRepeatedNTimes(int[] nums) { int n = nums.Length; for (int gap = 1; gap <= 3; ++gap) { for (int i = 0; i + gap < n; ++i) { if (nums[i] == nums[i + gap]) { return nums[i]; } } } // 不可能的情况 return-1; } }
[sol2-Python3]
1 2 3 4 5 6 7 8 9 10
classSolution: defrepeatedNTimes(self, nums: List[int]) -> int: n = len(nums) for gap inrange(1, 4): for i inrange(n - gap): if nums[i] == nums[i + gap]: return nums[i] # 不可能的情况 return -1
[sol2-C]
1 2 3 4 5 6 7 8 9 10 11
intrepeatedNTimes(int* nums, int numsSize) { for (int gap = 1; gap <= 3; ++gap) { for (int i = 0; i + gap < numsSize; ++i) { if (nums[i] == nums[i + gap]) { return nums[i]; } } } // 不可能的情况 return-1; }
[sol2-Golang]
1 2 3 4 5 6 7 8 9 10
funcrepeatedNTimes(nums []int)int { for gap := 1; gap <= 3; gap++ { for i, num := range nums[:len(nums)-gap] { if num == nums[i+gap] { return num } } } return-1// 不可能的情况 }
[sol2-JavaScript]
1 2 3 4 5 6 7 8 9 10 11 12
var repeatedNTimes = function(nums) { const n = nums.length; for (let gap = 1; gap <= 3; ++gap) { for (let i = 0; i + gap < n; ++i) { if (nums[i] === nums[i + gap]) { return nums[i]; } } } // 不可能的情况 return -1; };
while (true) { intx= random.nextInt(n), y = random.nextInt(n); if (x != y && nums[x] == nums[y]) { return nums[x]; } } } }
[sol3-C#]
1 2 3 4 5 6 7 8 9 10 11 12 13
publicclassSolution { publicintRepeatedNTimes(int[] nums) { int n = nums.Length; Random random = new Random();
while (true) { int x = random.Next(n), y = random.Next(n); if (x != y && nums[x] == nums[y]) { return nums[x]; } } } }
[sol3-Python3]
1 2 3 4 5 6 7 8
classSolution: defrepeatedNTimes(self, nums: List[int]) -> int: n = len(nums)
whileTrue: x, y = random.randrange(n), random.randrange(n) if x != y and nums[x] == nums[y]: return nums[x]
[sol3-C]
1 2 3 4 5 6 7 8 9
intrepeatedNTimes(int* nums, int numsSize) { srand(time(NULL)); while (true) { int x = random() % numsSize, y = random() % numsSize; if (x != y && nums[x] == nums[y]) { return nums[x]; } } }
[sol3-Golang]
1 2 3 4 5 6 7 8 9
funcrepeatedNTimes(nums []int)int { n := len(nums) for { x, y := rand.Intn(n), rand.Intn(n) if x != y && nums[x] == nums[y] { return nums[x] } } }
[sol3-JavaScript]
1 2 3 4 5 6 7 8 9 10
var repeatedNTimes = function(nums) { const n = nums.length;
while (true) { const x = Math.floor(Math.random() * n), y = Math.floor(Math.random() * n); if (x !== y && nums[x] === nums[y]) { return nums[x]; } } };