问题描述
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
限制:
2 <= n <= 100000
https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/
解法1 (C语言)
空间换时间
申请一块空间用于数组arr,把在nums中遇到的数字n作为arr的下标,arr[n]++。若arr[n]大于1,就说明数字n出现了两次,返回n
calloc与malloc的区别在于,malloc只会申请空间,而calloc会把申请到的空间置0
int findRepeatNumber(int* nums, int numsSize)
{
int *arr = (int *)calloc(numsSize, sizeof(int));
for (int i = 0; i < numsSize; i++)
{
arr[nums[i]]++;
if (arr[nums[i]] > 1)
{
return nums[i];
}
}
return -1;
}
执行用时:48 ms, 在所有 C 提交中击败了29.78%的用户
内存消耗:10.7 MB, 在所有 C 提交中击败了9.91%的用户
解法2
声明一个大小与nums相同的数组arr,初始值设为-1。
循环开始,当数组nums中第i个元素n第一次出现时,使数组arr下标n所指元素等于n,
既arr[nums[i]] = nums[i]
。若数组nums第i个元素n第二次出现,即arr[nums[i]] != -1
,返回元素nums[i]
(在VS下测试需对代码稍作改动,此处不表)
int findRepeatNumber(int* nums, int numsSize)
{
int arr[numsSize];
int arrIndex;
for (int i = 0; i < numsSize; i++)
{
arr[i] = -1;
}
for (int i = 0; i < numsSize; i++)
{
arrIndex = nums[i];
if(arr[arrIndex] != -1)
{
return nums[i];
}
arr[arrIndex] = nums[i];
}
return -1;
}