### 思路
为了快速判断某个数字是否在之前出现过,我们可以使用一个布尔数组来记录每个数字是否已经出现过。由于题目中给出了数字的范围(0 <= ai <= 200000),我们可以开一个大小为200001的布尔数组来记录每个数字的出现情况。
具体步骤如下:
1. 读取输入的整数n。
2. 如果n为0,直接输出0。
3. 初始化一个大小为200001的布尔数组`seen`,初始值为`false`。
4. 初始化一个计数器`count`为0。
5. 读取n个整数,对于每个整数:
- 如果该整数在`seen`数组中对应的位置为`false`,则将其标记为`true`并将计数器`count`加1。
6. 输出计数器`count`的值。
### 伪代码
```
function main():
read n
if n == 0:
print 0
return
seen = array of size 200001, initialized to false
count = 0
for i from 1 to n:
read num
if seen[num] == false:
seen[num] = true
count = count + 1
print count
```
### C++代码
#include <iostream>
#include <vector>int main() {int n;std::cin >> n;if (n == 0) {std::cout << 0 << std::endl;return 0;}std::vector<bool> seen(200001, false);int count = 0;for (int i = 0; i < n; ++i) {int num;std::cin >> num;if (!seen[num]) {seen[num] = true;++count;}}std::cout << count << std::endl;return 0;
}
### 总结
通过使用布尔数组来记录每个数字是否出现过,我们可以在O(1)的时间内判断某个数字是否已经出现过,从而将整体算法的时间复杂度降低到O(n)。这种方法利用了数组的随机访问特性,使得判断和记录操作都非常高效。