找到 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; }