Codility4 PermCheck

本文介绍了一种检查数组是否构成从1到N的排列的方法。通过使用哈希表记录每个元素出现的状态,确保所有元素恰好出现一次且都在有效范围内。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Task description

A non-empty zero-indexed array A consisting of N integers is given.

A permutation is a sequence containing each element from 1 to N once, and only once.

For example, array A such that:

    A[0] = 4
    A[1] = 1
    A[2] = 3
    A[3] = 2

is a permutation, but array A such that:

    A[0] = 4
    A[1] = 1
    A[2] = 3

is not a permutation.

The goal is to check whether array A is a permutation.

Write a function:

int solution(vector<int> &A);

that, given a zero-indexed array A, returns 1 if array A is a permutation and 0 if it is not.

For example, given array A such that:

    A[0] = 4
    A[1] = 1
    A[2] = 3
    A[3] = 2

the function should return 1.

Given array A such that:

    A[0] = 4
    A[1] = 1
    A[2] = 3

the function should return 0.

Assume that:

  • N is an integer within the range [1..100,000];
  • each element of array A is an integer within the range [1..1,000,000,000].

Complexity:

  • expected worst-case time complexity is O(N);
  • expected worst-case space complexity is O(N), beyond input storage (not counting the storage required for input arguments).

Elements of input arrays can be modified.


Solution

//CaptainMay AllRights Reserved
int solution1(vector<int> &A) {
    // write your code in C++11
    int n = A.size();
    int* hash  = new int[n];
    memset(hash, 0, 4*(n));

    int max = 0;
    for (int i = 0; i < n; ++i)  //这里需要考虑容器内有大于容器长度的数字,有就直接返回错误值
        if (A[i] > max)
            max = A[i];
    if (max != n)
        return 0;

    for (int i = 0; i < n; ++i)
        *(hash + i) = A[i] % (n) + 1; //存入hash数组,加1是为了判断便于之后判断n%n的情况

    for (int i = 0; i < n; ++i)
        if (*(hash + i) == 0)   //若上面没有加1,这里就不能这么写
            return 0;
    return 1;   
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值