返回
LeetCode 刷题记录:剑指 Offer 03. 数组中重复的数字
后端
2023-10-02 21:53:30
找到一个数字,它在数组中重复出现。请注意,我们使用的是“查找一个数字”这个概念,而不是“找出重复数字”。换句话说,你需要找到数组中的一个数字,而不是找出所有的重复数字。
解决方案:
方法一:哈希表
时间复杂度:O(n)。
空间复杂度:O(n)。
import java.util.HashSet;
import java.util.Set;
class Solution {
/**
* 剑指 Offer 03. 数组中重复的数字
*
* @param nums 整数数组
* @return 重复出现的数字
*/
public int findRepeatNumber(int[] nums) {
Set<Integer> set = new HashSet<>();
for (int num : nums) {
if (set.contains(num)) {
return num;
}
set.add(num);
}
return -1;
}
}
def find_repeat_number(nums):
"""
剑指 Offer 03. 数组中重复的数字
:param nums: 整数数组
:return: 重复出现的数字
"""
seen = set()
for num in nums:
if num in seen:
return num
seen.add(num)
return -1
方法二:原地交换
时间复杂度:O(n)。
空间复杂度:O(1)。
class Solution {
/**
* 剑指 Offer 03. 数组中重复的数字
*
* @param nums 整数数组
* @return 重复出现的数字
*/
public int findRepeatNumber(int[] nums) {
for (int i = 0; i < nums.length; i++) {
while (nums[i] != i) {
if (nums[i] == nums[nums[i]]) {
return nums[i];
}
// 交换nums[i]和nums[nums[i]]
int temp = nums[i];
nums[i] = nums[nums[i]];
nums[nums[i]] = temp;
}
}
return -1;
}
}
def find_repeat_number(nums):
"""
剑指 Offer 03. 数组中重复的数字
:param nums: 整数数组
:return: 重复出现的数字
"""
for i in range(len(nums)):
while nums[i] != i:
if nums[i] == nums[nums[i]]:
return nums[i]
# 交换nums[i]和nums[nums[i]]
temp = nums[i]
nums[i] = nums[nums[i]]
nums[nums[i]] = temp
return -1
总结:
在这道题中,我们提供了两种方法来解决问题:哈希表和原地交换。哈希表的方法简单易懂,但空间复杂度较高。原地交换的方法空间复杂度较低,但算法实现稍微复杂一些。