Before attempting this problem, you should be comfortable with:
Arrays - Iterating through and manipulating array elements
Hash Maps / Frequency Counting - Tracking how many times each element appears
Sorting - Understanding how sorted order reveals duplicates and gaps
Math (Sum Formulas) - Using arithmetic sum formulas to detect missing or duplicate values
Bit Manipulation (XOR) - Understanding XOR properties for finding unique elements
1. Brute Force
Intuition
The array should contain each number from 1 to n exactly once, but one number is duplicated and one is missing. The most direct approach is to count how many times each number from 1 to n appears in the array. A number appearing twice is the duplicate, and a number appearing zero times is the missing one.
Algorithm
Initialize a result array to store [duplicate, missing].
classSolution:deffindErrorNums(self, nums: List[int])-> List[int]:
res =[0,0]
n =len(nums)for i inrange(1, n +1):
cnt =0for num in nums:if num == i:
cnt +=1if cnt ==0:
res[1]= i
elif cnt ==2:
res[0]= i
return res
publicclassSolution{publicint[]findErrorNums(int[] nums){int[] res =newint[2];int n = nums.length;for(int i =1; i <= n; i++){int cnt =0;for(int num : nums){if(num == i){
cnt++;}}if(cnt ==0){
res[1]= i;}elseif(cnt ==2){
res[0]= i;}}return res;}}
classSolution{public:
vector<int>findErrorNums(vector<int>& nums){
vector<int>res(2,0);int n = nums.size();for(int i =1; i <= n; i++){int cnt =0;for(int num : nums){if(num == i){
cnt++;}}if(cnt ==0){
res[1]= i;}elseif(cnt ==2){
res[0]= i;}}return res;}};
classSolution{/**
* @param {number[]} nums
* @return {number[]}
*/findErrorNums(nums){const res =[0,0];const n = nums.length;for(let i =1; i <= n; i++){let cnt =0;for(const num of nums){if(num === i){
cnt++;}}if(cnt ===0){
res[1]= i;}elseif(cnt ===2){
res[0]= i;}}return res;}}
publicclassSolution{publicint[]FindErrorNums(int[] nums){int[] res =newint[2];int n = nums.Length;for(int i =1; i <= n; i++){int cnt =0;foreach(int num in nums){if(num == i){
cnt++;}}if(cnt ==0){
res[1]= i;}elseif(cnt ==2){
res[0]= i;}}return res;}}
funcfindErrorNums(nums []int)[]int{
res :=[]int{0,0}
n :=len(nums)for i :=1; i <= n; i++{
cnt :=0for_, num :=range nums {if num == i {
cnt++}}if cnt ==0{
res[1]= i
}elseif cnt ==2{
res[0]= i
}}return res
}
class Solution {funfindErrorNums(nums: IntArray): IntArray {val res =intArrayOf(0,0)val n = nums.size
for(i in1..n){var cnt =0for(num in nums){if(num == i){
cnt++}}if(cnt ==0){
res[1]= i
}elseif(cnt ==2){
res[0]= i
}}return res
}}
classSolution{funcfindErrorNums(_ nums:[Int])->[Int]{var res =[0,0]let n = nums.count
for i in1...n {var cnt =0for num in nums {if num == i {
cnt +=1}}if cnt ==0{
res[1]= i
}elseif cnt ==2{
res[0]= i
}}return res
}}
Time & Space Complexity
Time complexity: O(n2)
Space complexity: O(1)
2. Sorting
Intuition
After sorting, consecutive elements should differ by exactly 1. If two adjacent elements are equal, we found the duplicate. If two adjacent elements differ by 2, the missing number lies between them. We also need to handle the edge case where the missing number is n (the last element after sorting is not n).
Algorithm
Sort the array.
Initialize the result with missing = 1 (handles the case where 1 is missing).
Iterate through adjacent pairs:
If two elements are equal, record the duplicate.
If two elements differ by 2, the missing number is in between.
If the last element is not n, then n is the missing number.
classSolution:deffindErrorNums(self, nums: List[int])-> List[int]:
res =[0,1]
nums.sort()for i inrange(1,len(nums)):if nums[i]== nums[i -1]:
res[0]= nums[i]elif nums[i]- nums[i -1]==2:
res[1]= nums[i]-1if nums[-1]!=len(nums):
res[1]=len(nums)return res
publicclassSolution{publicint[]findErrorNums(int[] nums){int[] res ={0,1};Arrays.sort(nums);for(int i =1; i < nums.length; i++){if(nums[i]== nums[i -1]){
res[0]= nums[i];}elseif(nums[i]- nums[i -1]==2){
res[1]= nums[i]-1;}}if(nums[nums.length -1]!= nums.length){
res[1]= nums.length;}return res;}}
classSolution{public:
vector<int>findErrorNums(vector<int>& nums){
vector<int> res ={0,1};sort(nums.begin(), nums.end());for(int i =1; i < nums.size(); i++){if(nums[i]== nums[i -1]){
res[0]= nums[i];}elseif(nums[i]- nums[i -1]==2){
res[1]= nums[i]-1;}}if(nums.back()!= nums.size()){
res[1]= nums.size();}return res;}};
classSolution{/**
* @param {number[]} nums
* @return {number[]}
*/findErrorNums(nums){const res =[0,1];
nums.sort((a, b)=> a - b);for(let i =1; i < nums.length; i++){if(nums[i]=== nums[i -1]){
res[0]= nums[i];}elseif(nums[i]- nums[i -1]===2){
res[1]= nums[i]-1;}}if(nums[nums.length -1]!== nums.length){
res[1]= nums.length;}return res;}}
publicclassSolution{publicint[]FindErrorNums(int[] nums){int[] res ={0,1};
Array.Sort(nums);for(int i =1; i < nums.Length; i++){if(nums[i]== nums[i -1]){
res[0]= nums[i];}elseif(nums[i]- nums[i -1]==2){
res[1]= nums[i]-1;}}if(nums[nums.Length -1]!= nums.Length){
res[1]= nums.Length;}return res;}}
funcfindErrorNums(nums []int)[]int{
res :=[]int{0,1}
sort.Ints(nums)for i :=1; i <len(nums); i++{if nums[i]== nums[i-1]{
res[0]= nums[i]}elseif nums[i]-nums[i-1]==2{
res[1]= nums[i]-1}}if nums[len(nums)-1]!=len(nums){
res[1]=len(nums)}return res
}
class Solution {funfindErrorNums(nums: IntArray): IntArray {val res =intArrayOf(0,1)
nums.sort()for(i in1 until nums.size){if(nums[i]== nums[i -1]){
res[0]= nums[i]}elseif(nums[i]- nums[i -1]==2){
res[1]= nums[i]-1}}if(nums[nums.size -1]!= nums.size){
res[1]= nums.size
}return res
}}
classSolution{funcfindErrorNums(_ nums:[Int])->[Int]{var res =[0,1]var nums = nums.sorted()for i in1..<nums.count {if nums[i]== nums[i -1]{
res[0]= nums[i]}elseif nums[i]- nums[i -1]==2{
res[1]= nums[i]-1}}if nums[nums.count -1]!= nums.count {
res[1]= nums.count
}return res
}}
Time & Space Complexity
Time complexity: O(nlogn)
Space complexity: O(1) or O(n) depending on the sorting algorithm.
3. Frequency Count (Hash Table)
Intuition
Using extra space, we can count occurrences in a single pass and then check each number's frequency. A frequency array of size n+1 lets us directly index by number value. The number with count 2 is the duplicate, and the number with count 0 is the missing one.
Algorithm
Create a count array of size n+1 initialized to 0.
Iterate through the input array and increment count for each number.
classSolution:deffindErrorNums(self, nums: List[int])-> List[int]:
res =[0,0]# [duplicate, missing]
count = Counter(nums)for i inrange(1,len(nums)+1):if count[i]==0:
res[1]= i
if count[i]==2:
res[0]= i
return res
publicclassSolution{publicint[]findErrorNums(int[] nums){int n = nums.length;int[] count =newint[n +1];int[] res =newint[2];for(int num : nums){
count[num]++;}for(int i =1; i <= n; i++){if(count[i]==0){
res[1]= i;}if(count[i]==2){
res[0]= i;}}return res;}}
classSolution{public:
vector<int>findErrorNums(vector<int>& nums){int n = nums.size();
vector<int>count(n +1,0);
vector<int>res(2,0);for(int num : nums){
count[num]++;}for(int i =1; i <= n; i++){if(count[i]==0){
res[1]= i;}if(count[i]==2){
res[0]= i;}}return res;}};
classSolution{/**
* @param {number[]} nums
* @return {number[]}
*/findErrorNums(nums){const n = nums.length;const count =Array(n +1).fill(0);const res =[0,0];for(const num of nums){
count[num]++;}for(let i =1; i <= n; i++){if(count[i]===0){
res[1]= i;}if(count[i]===2){
res[0]= i;}}return res;}}
publicclassSolution{publicint[]FindErrorNums(int[] nums){int n = nums.Length;int[] count =newint[n +1];int[] res =newint[2];foreach(int num in nums){
count[num]++;}for(int i =1; i <= n; i++){if(count[i]==0){
res[1]= i;}if(count[i]==2){
res[0]= i;}}return res;}}
funcfindErrorNums(nums []int)[]int{
n :=len(nums)
count :=make([]int, n+1)
res :=[]int{0,0}for_, num :=range nums {
count[num]++}for i :=1; i <= n; i++{if count[i]==0{
res[1]= i
}if count[i]==2{
res[0]= i
}}return res
}
class Solution {funfindErrorNums(nums: IntArray): IntArray {val n = nums.size
val count =IntArray(n +1)val res =IntArray(2)for(num in nums){
count[num]++}for(i in1..n){if(count[i]==0){
res[1]= i
}if(count[i]==2){
res[0]= i
}}return res
}}
classSolution{funcfindErrorNums(_ nums:[Int])->[Int]{let n = nums.count
var count =[Int](repeating:0, count: n +1)var res =[0,0]for num in nums {
count[num]+=1}for i in1...n {if count[i]==0{
res[1]= i
}if count[i]==2{
res[0]= i
}}return res
}}
Time & Space Complexity
Time complexity: O(n)
Space complexity: O(n)
4. Negative Marking
Intuition
We can use the input array itself as a hash table by marking visited indices. For each number, we negate the value at the corresponding index. If we try to negate an already negative value, we found the duplicate. After processing, any positive value indicates its index corresponds to the missing number.
Algorithm
Iterate through the array:
For each value, take its absolute value to get the index.
If the value at that index is already negative, this is the duplicate.
Otherwise, negate the value at that index.
Iterate through the array again:
Find the index with a positive value that is not the duplicate.
classSolution:deffindErrorNums(self, nums: List[int])-> List[int]:
res =[0,0]for num in nums:
num =abs(num)
nums[num -1]*=-1if nums[num -1]>0:
res[0]= num
for i, num inenumerate(nums):if num >0and i +1!= res[0]:
res[1]= i +1return res
publicclassSolution{publicint[]findErrorNums(int[] nums){int[] res =newint[2];for(int num : nums){int absNum =Math.abs(num);if(nums[absNum -1]<0){
res[0]= absNum;}else{
nums[absNum -1]*=-1;}}for(int i =0; i < nums.length; i++){if(nums[i]>0&& i +1!= res[0]){
res[1]= i +1;return res;}}return res;}}
classSolution{public:
vector<int>findErrorNums(vector<int>& nums){
vector<int>res(2);for(int num : nums){int absNum =abs(num);if(nums[absNum -1]<0){
res[0]= absNum;}else{
nums[absNum -1]*=-1;}}for(int i =0; i < nums.size(); i++){if(nums[i]>0&& i +1!= res[0]){
res[1]= i +1;return res;}}return res;}};
classSolution{/**
* @param {number[]} nums
* @return {number[]}
*/findErrorNums(nums){const res =[0,0];for(let num of nums){const absNum = Math.abs(num);if(nums[absNum -1]<0){
res[0]= absNum;}else{
nums[absNum -1]*=-1;}}for(let i =0; i < nums.length; i++){if(nums[i]>0&& i +1!== res[0]){
res[1]= i +1;return res;}}return res;}}
publicclassSolution{publicint[]FindErrorNums(int[] nums){int[] res =newint[2];foreach(int num in nums){int absNum = Math.Abs(num);if(nums[absNum -1]<0){
res[0]= absNum;}else{
nums[absNum -1]*=-1;}}for(int i =0; i < nums.Length; i++){if(nums[i]>0&& i +1!= res[0]){
res[1]= i +1;return res;}}return res;}}
funcfindErrorNums(nums []int)[]int{
res :=[]int{0,0}for_, num :=range nums {
absNum := num
if absNum <0{
absNum =-absNum
}if nums[absNum-1]<0{
res[0]= absNum
}else{
nums[absNum-1]*=-1}}for i :=0; i <len(nums); i++{if nums[i]>0&& i+1!= res[0]{
res[1]= i +1return res
}}return res
}
class Solution {funfindErrorNums(nums: IntArray): IntArray {val res =intArrayOf(0,0)for(num in nums){val absNum = Math.abs(num)if(nums[absNum -1]<0){
res[0]= absNum
}else{
nums[absNum -1]*=-1}}for(i in nums.indices){if(nums[i]>0&& i +1!= res[0]){
res[1]= i +1return res
}}return res
}}
classSolution{funcfindErrorNums(_ nums:[Int])->[Int]{var nums = nums
var res =[0,0]for num in nums {let absNum =abs(num)if nums[absNum -1]<0{
res[0]= absNum
}else{
nums[absNum -1]*=-1}}for i in0..<nums.count {if nums[i]>0&& i +1!= res[0]{
res[1]= i +1return res
}}return res
}}
Time & Space Complexity
Time complexity: O(n)
Space complexity: O(1)
5. Math
Intuition
Using sum formulas, we can set up equations to solve for the duplicate and missing numbers. Let the duplicate be d and the missing be m. The difference between actual sum and expected sum gives us d - m. The difference between actual sum of squares and expected sum of squares gives us d^2 - m^2 = (d+m)(d-m). With these two equations, we can solve for both values.
Algorithm
Compute x = sum(nums) - sum(1 to n), which equals duplicate - missing.
Compute y = sum(nums^2) - sum(1^2 to n^2), which equals duplicate^2 - missing^2.
Since y = (duplicate + missing) * x, we get duplicate + missing = y / x.
Solve for missing: missing = (y/x - x) / 2 and duplicate = missing + x.
classSolution:deffindErrorNums(self, nums: List[int])-> List[int]:
N =len(nums)
x =0# duplicate - missing
y =0# duplicate^2 - missing^2for i inrange(1, N +1):
x += nums[i -1]- i
y += nums[i -1]**2- i**2
missing =(y - x**2)//(2* x)
duplicate = missing + x
return[duplicate, missing]
publicclassSolution{publicint[]findErrorNums(int[] nums){intN= nums.length;int x =0;// duplicate - missingint y =0;// duplicate^2 - missing^2for(int i =1; i <=N; i++){
x += nums[i -1]- i;
y += nums[i -1]* nums[i -1]- i * i;}int missing =(y - x * x)/(2* x);int duplicate = missing + x;returnnewint[]{duplicate, missing};}}
classSolution{public:
vector<int>findErrorNums(vector<int>& nums){int N = nums.size();longlong x =0;// duplicate - missinglonglong y =0;// duplicate^2 - missing^2for(int i =1; i <= N; i++){
x += nums[i -1]- i;
y +=(longlong)nums[i -1]* nums[i -1]-(longlong)i * i;}int missing =(y - x * x)/(2* x);int duplicate = missing + x;return{duplicate, missing};}};
classSolution{/**
* @param {number[]} nums
* @return {number[]}
*/findErrorNums(nums){constN= nums.length;let x =0;// duplicate - missinglet y =0;// duplicate^2 - missing^2for(let i =1; i <=N; i++){
x += nums[i -1]- i;
y += nums[i -1]**2- i **2;}const missing =(y - x **2)/(2* x);const duplicate = missing + x;return[duplicate, missing];}}
publicclassSolution{publicint[]FindErrorNums(int[] nums){int N = nums.Length;long x =0;// duplicate - missinglong y =0;// duplicate^2 - missing^2for(int i =1; i <= N; i++){
x += nums[i -1]- i;
y +=(long)nums[i -1]* nums[i -1]-(long)i * i;}int missing =(int)((y - x * x)/(2* x));int duplicate =(int)(missing + x);returnnewint[]{ duplicate, missing };}}
funcfindErrorNums(nums []int)[]int{
N :=len(nums)
x :=0// duplicate - missing
y :=0// duplicate^2 - missing^2for i :=1; i <= N; i++{
x += nums[i-1]- i
y += nums[i-1]*nums[i-1]- i*i
}
missing :=(y - x*x)/(2* x)
duplicate := missing + x
return[]int{duplicate, missing}}
class Solution {funfindErrorNums(nums: IntArray): IntArray {val N = nums.size
var x =0L// duplicate - missingvar y =0L// duplicate^2 - missing^2for(i in1..N){
x += nums[i -1]- i
y += nums[i -1].toLong()* nums[i -1]- i.toLong()* i
}val missing =((y - x * x)/(2* x)).toInt()val duplicate = missing + x.toInt()returnintArrayOf(duplicate, missing)}}
classSolution{funcfindErrorNums(_ nums:[Int])->[Int]{letN= nums.count
var x =0// duplicate - missingvar y =0// duplicate^2 - missing^2for i in1...N{
x += nums[i -1]- i
y += nums[i -1]* nums[i -1]- i * i
}let missing =(y - x * x)/(2* x)let duplicate = missing + x
return[duplicate, missing]}}
Time & Space Complexity
Time complexity: O(n)
Space complexity: O(1)
6. Bitwise XOR
Intuition
XOR has the property that a ^ a = 0. If we XOR all numbers in the array with all numbers from 1 to n, pairs cancel out, leaving us with duplicate ^ missing. To separate them, we find a bit where they differ (using the rightmost set bit), then partition all numbers into two groups based on that bit. XORing within each group isolates the duplicate and missing values.
Algorithm
XOR all array elements with all numbers 1 to n. This gives duplicate ^ missing.
Find the rightmost set bit in the XOR result (this bit differs between duplicate and missing).
Partition all numbers (from array and from 1 to n) into two groups based on this bit.
XOR numbers within each group separately to get two candidates x and y.
Check which candidate appears in the array to identify the duplicate.
classSolution:deffindErrorNums(self, nums: List[int])-> List[int]:
N =len(nums)# a ^ a = 0# xorr = (1 ^ 2 ^ ... N) ^ (nums[0] ^ nums[1] ^ ... nums[N - 1])# xorr = missing ^ duplicate
xorr =0for i inrange(1, N +1):
xorr ^= i
xorr ^= nums[i -1]# bit that is set in only one number among (duplicate, missing),# will be set in (duplicate ^ missing)# take rightMost set bit for simplicity
rightMostBit = xorr &~(xorr -1)# divide numbers (from nums, from [1, N]) into two sets w.r.t the rightMostBit# xorr the numbers of these sets independently
x = y =0for i inrange(1, N +1):if i & rightMostBit:
x ^= i
else:
y ^= i
if nums[i -1]& rightMostBit:
x ^= nums[i -1]else:
y ^= nums[i -1]# identify the duplicate number from x and yfor num in nums:if num == x:return[x, y]return[y, x]
publicclassSolution{publicint[]findErrorNums(int[] nums){intN= nums.length;// a ^ a = 0// xorr = (1 ^ 2 ^ ... N) ^ (nums[0] ^ nums[1] ^ ... nums[N - 1])// xorr = missing ^ duplicateint xorr =0;for(int i =1; i <=N; i++){
xorr ^= i;
xorr ^= nums[i -1];}// bit that is set in only one number among (duplicate, missing),// will be set in (duplicate ^ missing)// take rightMost set bit for simplicityint rightMostBit = xorr &~(xorr -1);// divide numbers (from nums, from [1, N]) into two sets w.r.t the rightMostBit// xorr the numbers of these sets independentlyint x =0, y =0;for(int i =1; i <=N; i++){if((i & rightMostBit)!=0){
x ^= i;}else{
y ^= i;}if((nums[i -1]& rightMostBit)!=0){
x ^= nums[i -1];}else{
y ^= nums[i -1];}}// identify the duplicate number from x and yfor(int num : nums){if(num == x){returnnewint[]{x, y};}}returnnewint[]{y, x};}}
classSolution{public:
vector<int>findErrorNums(vector<int>& nums){int N = nums.size();// a ^ a = 0// xorr = (1 ^ 2 ^ ... N) ^ (nums[0] ^ nums[1] ^ ... nums[N - 1])// xorr = missing ^ duplicateint xorr =0;for(int i =1; i <= N; i++){
xorr ^= i;
xorr ^= nums[i -1];}// bit that is set in only one number among (duplicate, missing),// will be set in (duplicate ^ missing)// take rightMost set bit for simplicityint rightMostBit = xorr &~(xorr -1);// divide numbers (from nums, from [1, N]) into two sets w.r.t the rightMostBit// xorr the numbers of these sets independentlyint x =0, y =0;for(int i =1; i <= N; i++){if(i & rightMostBit){
x ^= i;}else{
y ^= i;}if(nums[i -1]& rightMostBit){
x ^= nums[i -1];}else{
y ^= nums[i -1];}}// identify the duplicate number from x and yfor(int num : nums){if(num == x){return{x, y};}}return{y, x};}};
classSolution{/**
* @param {number[]} nums
* @return {number[]}
*/findErrorNums(nums){constN= nums.length;// a ^ a = 0// xorr = (1 ^ 2 ^ ... N) ^ (nums[0] ^ nums[1] ^ ... nums[N - 1])// xorr = missing ^ duplicatelet xorr =0;for(let i =1; i <=N; i++){
xorr ^= i;
xorr ^= nums[i -1];}// bit that is set in only one number among (duplicate, missing),// will be set in (duplicate ^ missing)// take rightMost set bit for simplicityconst rightMostBit = xorr &~(xorr -1);// divide numbers (from nums, from [1, N]) into two sets w.r.t the rightMostBit// xorr the numbers of these sets independentlylet x =0,
y =0;for(let i =1; i <=N; i++){if(i & rightMostBit){
x ^= i;}else{
y ^= i;}if(nums[i -1]& rightMostBit){
x ^= nums[i -1];}else{
y ^= nums[i -1];}}// identify the duplicate number from x and yfor(let num of nums){if(num === x){return[x, y];}}return[y, x];}}
publicclassSolution{publicint[]FindErrorNums(int[] nums){int N = nums.Length;int xorr =0;for(int i =1; i <= N; i++){
xorr ^= i;
xorr ^= nums[i -1];}int rightMostBit = xorr &~(xorr -1);int x =0, y =0;for(int i =1; i <= N; i++){if((i & rightMostBit)!=0){
x ^= i;}else{
y ^= i;}if((nums[i -1]& rightMostBit)!=0){
x ^= nums[i -1];}else{
y ^= nums[i -1];}}foreach(int num in nums){if(num == x){returnnewint[]{ x, y };}}returnnewint[]{ y, x };}}
funcfindErrorNums(nums []int)[]int{
N :=len(nums)
xorr :=0for i :=1; i <= N; i++{
xorr ^= i
xorr ^= nums[i-1]}
rightMostBit := xorr &^(xorr -1)
x, y :=0,0for i :=1; i <= N; i++{if i&rightMostBit !=0{
x ^= i
}else{
y ^= i
}if nums[i-1]&rightMostBit !=0{
x ^= nums[i-1]}else{
y ^= nums[i-1]}}for_, num :=range nums {if num == x {return[]int{x, y}}}return[]int{y, x}}
class Solution {funfindErrorNums(nums: IntArray): IntArray {val N = nums.size
var xorr =0for(i in1..N){
xorr = xorr xor i
xorr = xorr xor nums[i -1]}val rightMostBit = xorr and(xorr -1).inv()var x =0var y =0for(i in1..N){if(i and rightMostBit !=0){
x = x xor i
}else{
y = y xor i
}if(nums[i -1]and rightMostBit !=0){
x = x xor nums[i -1]}else{
y = y xor nums[i -1]}}for(num in nums){if(num == x){returnintArrayOf(x, y)}}returnintArrayOf(y, x)}}
classSolution{funcfindErrorNums(_ nums:[Int])->[Int]{letN= nums.count
var xorr =0for i in1...N{
xorr ^= i
xorr ^= nums[i -1]}let rightMostBit = xorr &~(xorr -1)var x =0var y =0for i in1...N{if i & rightMostBit !=0{
x ^= i
}else{
y ^= i
}if nums[i -1]& rightMostBit !=0{
x ^= nums[i -1]}else{
y ^= nums[i -1]}}for num in nums {if num == x {return[x, y]}}return[y, x]}}
Time & Space Complexity
Time complexity: O(n)
Space complexity: O(1)
Common Pitfalls
Confusing the Output Order
The problem asks to return [duplicate, missing] in that specific order. Accidentally swapping the order and returning [missing, duplicate] produces wrong answers even when both numbers are correctly identified.
Not Handling Edge Cases at Array Boundaries
When using the sorting approach, special handling is needed if the missing number is 1 (the first element) or n (the last element). These boundary cases require explicit checks beyond just comparing adjacent elements.