Welcome to Subscribe On Youtube
268. Missing Number
Description
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.
Example 1:
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.
Example 2:
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.
Example 3:
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.
Constraints:
n == nums.length
1 <= n <= 104
0 <= nums[i] <= n
- All the numbers of
nums
are unique.
Follow up: Could you implement a solution using only O(1)
extra space complexity and O(n)
runtime complexity?
Solutions
Solution 1: Bitwise Operation
The XOR operation has the following properties:
- Any number XOR 0 is still the original number, i.e., $x \oplus 0 = x$;
- Any number XOR itself is 0, i.e., $x \oplus x = 0$;
Therefore, we can traverse the array, perform XOR operation between each element and the numbers $[0,..n]$, and the final result will be the missing number.
The time complexity is $O(n)$, where $n$ is the length of the array. The space complexity is $O(1)$.
Solution 2: Mathematics
We can also solve this problem using mathematics. By calculating the sum of $[0,..n]$, subtracting the sum of all numbers in the array, we can obtain the missing number.
The time complexity is $O(n)$, where $n$ is the length of the array. The space complexity is $O(1)$.
-
class Solution { public int missingNumber(int[] nums) { int n = nums.length; int ans = n; for (int i = 0; i < n; ++i) { ans ^= (i ^ nums[i]); } return ans; } }
-
class Solution { public: int missingNumber(vector<int>& nums) { int n = nums.size(); int ans = n; for (int i = 0; i < n; ++i) { ans ^= (i ^ nums[i]); } return ans; } };
-
class Solution: def missingNumber(self, nums: List[int]) -> int: return reduce(xor, (i ^ v for i, v in enumerate(nums, 1)))
-
func missingNumber(nums []int) (ans int) { n := len(nums) ans = n for i, v := range nums { ans ^= (i ^ v) } return }
-
function missingNumber(nums: number[]): number { const n = nums.length; let ans = n; for (let i = 0; i < n; ++i) { ans ^= i ^ nums[i]; } return ans; }
-
/** * @param {number[]} nums * @return {number} */ var missingNumber = function (nums) { const n = nums.length; let ans = n; for (let i = 0; i < n; ++i) { ans ^= i ^ nums[i]; } return ans; };
-
class Solution { /** * @param Integer[] $nums * @return Integer */ function missingNumber($nums) { $n = count($nums); $sumN = (($n + 1) * $n) / 2; for ($i = 0; $i < $n; $i++) { $sumN -= $nums[$i]; } return $sumN; } }
-
impl Solution { pub fn missing_number(nums: Vec<i32>) -> i32 { let n = nums.len() as i32; let mut ans = n; for (i, v) in nums.iter().enumerate() { ans ^= (i as i32) ^ v; } ans } }