Given an array nums containing n distinct numbers in the range [0, n], return the only number in the range that is missing from the array.
Constraints
n == nums.length
1 <= n <= 104
0 <= nums[i] <= n
All the numbers of nums are unique.
Approach
Links
GeeksforGeeks
YouTube
Examples
Input: nums = [3, 0, 1]
Output: 2
Explanation: n = 3 since there are 3 numbers, so all numbers are in the range [0, 3]. 2 is the missing number in the range since it does not appear in nums.
Input: nums = [0, 1]
Output: 2
Explanation: n = 2 since there are 2 numbers, so all numbers are in the range [0, 2]. 2 is the missing number in the range since it does not appear in nums.
Input: nums = [9, 6, 4, 2, 3, 5, 7, 0, 1]
Output: 8
Explanation: n = 9 since there are 9 numbers, so all numbers are in the range [0, 9]. 8 is the missing number in the range since it does not appear in nums.
Input: nums = [0]
Output: 1
Explanation: n = 1 since there is 1 number, so all numbers are in the range [0, 1]. 1 is the missing number in the range since it does not appear in nums.
Solutions
/**
* Time complexity : O(NlogN)
* Space complexity : O(1)
*/
class Solution {
public int missingNumber(int[] nums) {
Arrays.sort(nums);
// Ensure that n is at the last index
if (nums[nums.length-1] != nums.length) {
return nums.length;
}
// Ensure that 0 is at the first index
else if (nums[0] != 0) {
return 0;
}
// If we get here, then the missing number is on the range (0, n)
for (int i = 1; i < nums.length; i++) {
int expectedNum = nums[i-1] + 1;
if (nums[i] != expectedNum) {
return expectedNum;
}
}
// Array was not missing any numbers
return -1;
}
}
/**
* Time complexity : O(n)
* Space complexity : O(n)
*/
class Solution {
public int missingNumber(int[] nums) {
Set<Integer> numSet = new HashSet<Integer>();
for (int num : nums) numSet.add(num);
int expectedNumCount = nums.length + 1;
for (int number = 0; number < expectedNumCount; number++) {
if (!numSet.contains(number)) {
return number;
}
}
return -1;
}
}
/**
* Time complexity : O(n)
* Space complexity : O(1)
*/
class Solution {
public int missingNumber(int[] nums) {
int expectedSum = nums.length*(nums.length + 1)/2;
int actualSum = 0;
for (int num : nums) actualSum += num;
return expectedSum - actualSum;
}
}
Follow up
Could you implement a solution using only O(1) extra space complexity and O(n) runtime complexity?