leetcode刷题开始啦, 每天记录几道题.
剑指offer 03. 数组中重复的数字
题目描述
找出数组中重复的数字.
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例1
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
限制
2 <= n <= 100000
思路1
哈希表的添加和查找时间复杂度是 O ( 1 ) O(1) O(1), 所以我们遍历数组, 用哈希表存储不曾出现的元素, 当我们遍历到已经出现的元素时, 返回该元素即可.
时间复杂度:
O
(
N
)
O(N)
O(N), 遍历数组. 哈希表添加查找是
O
(
1
)
O(1)
O(1).
空间复杂度:
O
(
N
)
O(N)
O(N), 哈希表占用空间为
O
(
N
)
O(N)
O(N).
Python
class Solution:
def findRepeatNumber(self, nums: List[int]) -> int:
dic = {}
for num in nums:
if num in dic:
return num
else:
dic[num] = 1
C
题目告诉我们所有的数字都在0~n-1之间, 所以可以牺牲空间用n个元素的数组构建哈希表.
int findRepeatNumber(int* nums, int numsSize){
int* dic = (int*)malloc(sizeof(int) * numsSize);
for (int i=0; i<numsSize; ++i){
dic[i] = 0;
}
for (int i=0; i<numsSize; ++i){
++dic[nums[i]];
if (dic[nums[i]] > 1){
return nums[i];
}
}
return -1;
}
C++
C++, 我是个初学者.
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
unordered_map<int, bool> dic;
for(int num : nums){
if(dic[num]){
return num;
}
dic[num] = true;
}
return -1;
}
};
思路2
数组元素是n个, 元素范围是0~n-1, 并且必定有重复数字, 那么可以用交换数组元素的方式实现原地哈希表. 我没写, 时间晚了, 该睡觉了. 下次想起来再写.