给定一个个数字arr,判断数组arr中是否所有的数字都只出现过一次。
输入包括两行,第一行一个整数n,代表数组arr的长度。第二行包括n个整数,代表数组arr。
如果arr中所有数字都只出现一次,输出“YES”,否则输出“NO”。
3 1 2 3
YES
3 1 2 1
NO
要求1.时间复杂度。2.额外空间复杂度。
/*时间 O(NlogN) 额外空间 O(1) */ #include <stdio.h> void swap(int *arr, int i, int j); void downAdjust(int *arr, int i, int n); int main(void) { int n, *arr, size; scanf("%d", &n); arr = (int *) malloc(sizeof(int) * n); size = n; for (int i = 0; i < n; i++) { scanf("%d", arr + i); } for (int i = (n - 1) >> 1; i >= 0; i--) { downAdjust(arr, i, size); } while (size > 1) { swap(arr, 0, size - 1); downAdjust(arr, 0, size - 1); size--; } for (int i = 1; i < n; i++) { if (arr[i] == arr[i - 1]) { printf("NO\n"); return 0; } } printf("YES\n"); return 0; } void swap(int *arr, int i, int j) { int t = arr[i]; arr[i] = arr[j]; arr[j] = t; } void downAdjust(int *arr, int i, int n) { int left = i << 1 | 1, bigger; while (left < n) { bigger = left + 1 < n && arr[left + 1] > arr[left] ? left + 1 : left; if (arr[i] >= arr[bigger]) { break; } swap(arr, i, bigger); i = bigger; left = i << 1 | 1; } }
// 时间 O(N) 额外空间 O(N) #include <cstdio> #include <unordered_set> using namespace std; int main() { int n, cur; unordered_set<int> iset; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &cur); if (iset.find(cur) != iset.end()) { printf("NO\n"); return 0; } iset.insert(cur); } printf("YES\n"); return 0; }