找到 N 个数字中缺少的数字
题意如题 找到 N 个数字中缺少的一个数字
方法 1:求和
算出 1 + 2 + ... + N 的和然后减去数组中 N - 1 个数字的和
int missNum(int N, int a[maxn]) {
long long sum = 0;
for(int i = 0; i < N - 1; i ++)
sum += a[i];
return (1 + N) * N / 2 - sum;
}
这个方法的缺点是有可能会出现溢出 时间复杂度是 O(N)
方法2:位运算
用与运算 a ^ a = 0 a ^ a ^ b = b 所以可以用位运算实现
int missNum(int N, int a[maxn]) {
int ans = N;
for(int i = 0; i < N - 1; i ++)
ans ^= (a[i] ^ (i + 1));
return ans;
}
时间复杂度 O(N)
方法3:二分法
如果无序数组要先排序 在此假设数组有序
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int N;
int a[maxn];
int main() {
scanf("%d", &N);
for(int i = 0; i < N - 1; i ++)
scanf("%d", &a[i]);
int l = 0, r = N - 1, mid;
while(l <= r) {
mid = (l + r) / 2;
if(a[mid] == mid + 1) l = mid +1;
else r = mid - 1;
}
printf("%d\n", mid + 1);
return 0;
}

浙公网安备 33010602011771号