Mark every observed value, recording the duplicate, then scan the expected range for the unseen value.
Complexity
O(n) time and O(n) space.
Identify the duplicated number and the missing number in a corrupted set from one through n.
Mark every observed value, recording the duplicate, then scan the expected range for the unseen value.
O(n) time and O(n) space.
package main
func findErrorNums(nums []int) []int {
seen := make([]bool, len(nums)+1)
duplicate := -1
for _, value := range nums {
if seen[value] {
duplicate = value
}
seen[value] = true
}
for value := 1; value <= len(nums); value++ {
if !seen[value] {
return []int{duplicate, value}
}
}
return []int{duplicate, -1}
}
class Solution:
def findErrorNums(self, nums: list[int]) -> list[int]:
seen = [False] * (len(nums) + 1)
duplicate = -1
for value in nums:
if seen[value]:
duplicate = value
seen[value] = True
missing = next(value for value in range(1, len(nums) + 1) if not seen[value])
return [duplicate, missing]
function findErrorNums(nums: number[]): number[] {
const seen = new Array<boolean>(nums.length + 1).fill(false);
let duplicate = -1;
for (const value of nums) { if (seen[value]) duplicate = value; seen[value] = true; }
for (let value = 1; value <= nums.length; value += 1) {
if (!seen[value]) return [duplicate, value];
}
return [duplicate, -1];
}