"""
Hash Table
时间: O(n)
空间: O(n)
"""
class Solution(object):
def findRepeatNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
dic = {}
for i in nums:
if i not in dic:
dic[i] = 1
else:
return i
"""
检查下标
时间: O(n)
空间: O(1)
"""
class Solution(object):
def findRepeatNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
for i, num in enumerate(nums):
while nums[i] != i:
m = nums[i]
if nums[m] != m:
nums[i], nums[m] = nums[m], nums[i]
else:
return m
return -1
遍历中,第一次遇到数字 x 时,将其交换至索引 x 处;而当第二次遇到数字 x 时,一定有 nums[x] = x,此时即可得到一组重复数字。
class Solution {
public int findRepeatNumber(int[] nums) {
int i = 0;
while (i < nums.length) {
if (nums[i] == i) {
i++;//占位正确
continue;
}
if (nums[nums[i]] == nums[i]) return nums[i];//说明索引为nums[i]和i出现重复值
int tmp = nums[i];
nums[i] = nums[tmp];
nums[tmp] = tmp;//交换索引为 i 和 nums[i] 的元素值,将此数字交换至对应索引位置。
//不断重复交换总能换对
}
return -1;
}
}
// 时间复杂度O(n),空间复杂度O(1)
class Solution {
public int findRepeatNumber(int[] nums) {
for (int i = 0; i < nums.length; i++) {
while (i != nums[i]) {
if (nums[i] == nums[nums[i]]) {
return nums[i];
}
int tmp = nums[nums[i]];
nums[nums[i]] = nums[i];
nums[i] = tmp;
}
}
return -1;
}
}
共以下 11 个回答
根据题目特点,原地排序
原地变换(给每个元素找家)
原地交换
遍历中,第一次遇到数字 x 时,将其交换至索引 x 处;而当第二次遇到数字 x 时,一定有 nums[x] = x,此时即可得到一组重复数字。
时间复杂度O(n),空间复杂度O(1)