在数组C ++中出现K次

时间:2019-09-29 23:44:16

标签: c++ algorithm

所以我有一个算法,假设该算法返回在数组中出现K次的int。如果出现超过1个int K次,则应返回较高的值。我的以下算法无法正常工作。在下面的示例中,当它应该返回5时,它返回1。

#include <iostream>
#include <algorithm>

int appearsKTimes (int size, int inputArray[], int k) {

    std::sort(inputArray, inputArray + size);
    int i = 1, count = 1;
    int element = inputArray[0];
    int res = -1;
    while (i < size) {
        if (element == inputArray[i]) {
            count++;
        } else {
            if (count == k) {
                res = element;
            }

            element = inputArray[i];
            count = 1;
        }
        i++;
    }
    std::cout << res << std::endl;
    return res;
}

int main() { 

    const int size = 7;
    int array[size] = {1, 1, 2, 2, 2, 5, 5};
    int occurences = 2;

    appearsKTimes(size, array, occurences);
}

2 个答案:

答案 0 :(得分:1)

if (count == k) {
    res = element;
}
std::cout << res << std::endl;

检查最后一个元素的计数。

我也认为从末尾开始计数会更好。如果从第一个元素开始计数,则需要一直检查所有数组。

答案 1 :(得分:1)

您的排序方法很好,只需要O(NlogN)时间复杂度,但也可以考虑使用另一种哈希表。它需要时间O(N)和空间O(N)。它更短,只有几个额外的变量,因此出错的机会更少:

1)使用unordered_map(哈希表)计算数字频率:O(N)

2)查找恰好出现k次的最大数字:O(N)

int appearsKTimes (int size, int inputArray[], int k) {

    unordered_map<int, int> freqs;
    for (int i = 0; i < size; i++) {
        freqs[inputArray[i]]++;
    }

    int res = - 1;
    for (int i = 0; i < size; i++) {
        if (freqs[inputArray[i]] == k)
            res = max(res, inputArray[i]);
    }

    return res;
}