首页 > 试题广场 >

判断数组中所有的数字是否只出现一次

[编程题]判断数组中所有的数字是否只出现一次
  • 热度指数:1486 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个个数字arr,判断数组arr中是否所有的数字都只出现过一次。

输入描述:
输入包括两行,第一行一个整数n,代表数组arr的长度。第二行包括n个整数,代表数组arr


输出描述:
如果arr中所有数字都只出现一次,输出“YES”,否则输出“NO”。
示例1

输入

3
1 2 3

输出

YES
示例2

输入

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


发表于 2022-02-06 15:41:07 回复(0)