137. Single Number II
Description
Given an integer array nums where every element appears three times except for one, which appears exactly once. Find the single element and return it.
You must implement a solution with a linear runtime complexity and use only constant extra space.
Example 1:
Input: nums = [2,2,3,2] Output: 3
Example 2:
Input: nums = [0,1,0,1,0,1,99] Output: 99
Constraints:
1 <= nums.length <= 3 * 104-231 <= nums[i] <= 231 - 1- Each element in
numsappears exactly three times except for one element which appears once.
Solutions
Solution 1: Bitwise Operation
Thinking
Numbers appear three times except one; XOR is no longer enough because \(x\oplus x\oplus x=x\). The follow-up still wants constant space. Count \(1\)s per bit modulo \(3\): bits from the triples vanish, and the remainder is the answer. The sign bit is handled separately to avoid overflow.
We can enumerate each binary bit \(i\), and for each binary bit, we calculate the sum of all numbers on that bit. If the sum of the numbers on that bit can be divided by 3, then the number that only appears once on that bit is 0, otherwise it is 1.
The time complexity is \(O(n \times \log M)\), where \(n\) and \(M\) are the length of the array and the range of elements in the array, respectively. The space complexity is \(O(1)\).
1 2 3 4 5 6 7 8 9 10 11 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 | |
1 2 3 4 5 6 7 8 | |
1 2 3 4 5 6 7 8 9 10 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
Solution 2: Digital Circuit
Thinking
Solution 1 rescans the array for every bit. Two integers \(a,b\) store each bit's count modulo \(3\); a truth table updates them as each number arrives, so one pass does the same counting.
We can use a more efficient method that uses digital circuits to simulate the above bitwise operation.
Each binary bit of an integer can only represent 2 states, 0 or 1. However, we need to represent the sum of the \(i\)-th bit of all integers traversed so far modulo 3. Therefore, we can use two integers \(a\) and \(b\) to represent it. There are three possible cases:
- The \(i\)-th bit of integer \(a\) is 0 and the \(i\)-th bit of integer \(b\) is 0, which means the modulo 3 result is 0;
- The \(i\)-th bit of integer \(a\) is 0 and the \(i\)-th bit of integer \(b\) is 1, which means the modulo 3 result is 1;
- The \(i\)-th bit of integer \(a\) is 1 and the \(i\)-th bit of integer \(b\) is 0, which means the modulo 3 result is 2.
We use integer \(c\) to represent the number to be read in, and the truth table is as follows:
| \(a_i\) | \(b_i\) | \(c_i\) | New \(a_i\) | New \(b_i\) |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 0 | 1 |
| 0 | 1 | 0 | 0 | 1 |
| 0 | 1 | 1 | 1 | 0 |
| 1 | 0 | 0 | 1 | 0 |
| 1 | 0 | 1 | 0 | 0 |
Based on the truth table, we can write the logical expression:
and:
The final result is \(b\), because when the binary bit of \(b\) is 1, it means that the number appears only once.
The time complexity is \(O(n)\), where \(n\) is the length of the array. The space complexity is \(O(1)\).
1 2 3 4 5 6 7 8 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 8 9 | |
1 2 3 4 5 6 7 8 9 10 11 | |
1 2 3 4 5 6 7 8 9 10 11 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
Solution 3: Set + Math
Thinking
If extra space is allowed, the unique value is \((3\sum_{\mathrm{unique}}-\sum_{\mathrm{all}})/2\). Deduplicate, sum twice, and divide. Direct, but \(O(n)\) space.
1 2 3 4 5 | |
1 2 3 4 5 | |
Solution 4: Bit Manipulation
Thinking
The Solution 2 state machine collapses to two masks: \(\textit{ans}\) and \(\textit{acc}\) hold bits seen once and twice. They stay disjoint as \(x\) arrives; \(\textit{ans}\) is the number that appeared once. Shorter code.
1 2 3 4 5 6 7 8 9 10 | |
1 2 3 4 5 6 7 8 9 10 | |