统计数组中不同元素出现的次数(时间复杂度O(n),空间复杂度o(1))

转载 2015年07月10日 22:02:43

一个长度大小为n的数组,数组中的每个元素的取值范围在[1,n],且为正整数。
问:如何在时间复杂度为O(n),空间复杂度为O(1)的条件下,统计数组中不同元素出现的次数。

思路:数组按序扫描,通过当前元素的值作为下标,找到下一个元素。最后得到的数组中,下标(因为下标从0开始的,故输出时需要+1)为数组中出现的元素,每个下标对应的值取反输出即是该元素出现的频率。
若当前元素小于0,
     则跳过;
若当前元素大于0,
        则判断其作为下标索引到的元素是否大于0,
                若大于0,则索引到的元素赋值给当前元素,索引到的元素置为-1;
                若小于0,则索引到的元素自减1,当前元素置为0;
#include <iostream>
using namespace std;

void work(int a[], int n)
{
    int i = 0;
    while(i < n)
    {
        int temp = a[i] - 1;
        if(temp < 0)
        {
            i++;
            continue;
        }
        if(a[temp] > 0)
        {
            a[i] = a[temp];
            a[temp] = -1;
        }
        else
        {
            a[temp]--;
            a[i] = 0;
        }
    }
}

int main()
{
    int n = 10;
        int *a = new int[n];
        for(int i = 0; i < n; i++)
            cin >> a[i];
        work(a, n);
        for(int i = 0; i < n; i++)
            if(a[i] < 0)
                cout << i + 1 << " " << (-a[i]) << endl;
        cout << "********************" << endl;
        delete[] a;
    
    return 0;

}

用正数/负数来区分a[i]上是原来的值,还是用于计数的值
随便举个例子,比如 { 2, 5, 5, 2, 3 }
看到第一个是 2,即2有1个,所以先将这个“1”保存到a[2-1]的位置上。但a[2-1]有有效数呀,咋办?移动一下就行。
假设我不用负数,而是用中括号来表示计数,步骤依次是
{ 2, 5, 5, 2, 3 }
5, [1], 5, 2, 3
3, [1], 5, 2, [1]
5, [1], [1], 2, [1]
[0], [1], [1], 2, [2]
[0], [2], [1], [0], [2]
结果是 1有0个, 2有2个, 3有1个, 4有0个, 5有2个

相关文章推荐

如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)

题目: 写一个函数判断一个int类型的数组是否是有效的。  所谓有效是指:假设数组大小为n,那么这个int数组里的值为0~n-1之间的数,并且每个数只能出现一次,否则就是无效数组。  例如[...

找出一个数组中只出现过一次的元素

/* *copyright@nciaebupt 转载请保留此信息 *一个数组中有n个元素,其中只有一个只出现一次,其他恰好都出现两次, *怎样找出那个维一出现一次的元素。 *要求的复杂度:时间:O(n...

找出一个数组中出现次数超过一半的那个数字,要求时间复杂度O(n)和空间复杂度为O(1)。

数组中超过出现次数超过一半的数字 题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。  分析:编程之美上也有这道题,不过它变换了题目的表述形式,如下:寻找发帖水王: Tango...

找出重复次数最多的数字

问题 给定一个大小为n的数组,该数组包含数字的范围在 [0...k-1], k是一个正整数,k 例如, 假设k= 10给定的数组是arr[] = {1, 2, 2, 2, 0, 2, 0...

求数组中不同元素的个数

今天莫名的想到如果存在一个有元素重复出现的数组,那么如何求出这个数组中不同元素的个数。越想越不得解。然后搜索了关键词,居然找了大半天(百度的结果我都翻了好几页才找到满足要求的解答。)所以原创这篇博客,...

面试题:统计一个数组中不重复出现的元素个数

假设是一个整数数组,事先已经按照升序或者降序拍好次序,但是数组中的若干元素重复出现。给出代码要求统计该数组中不重复出现的元素个数。例如整数数组: int[] array=new int[]{1,1,1...

统计数组中各元素出现次数

1.问题描述         给定一大小为N的整数数组,其元素取值范围为[1,N],请统计各元素出现的次数,并要求时间复杂度为O(n),空间复杂度为O(1)。 2.思路        若没有空间的限...

统计数组中元素出现的次数——Java小程序

这段小代码,是在阅读了这篇博文后,作为练习写出来的,原文中,作者做了很详细的分析,在此根据自己的理解整理出了这篇博客。   原题是,给定一个int数组,找出数组中出现次数为奇数的数字。最终决定建立一个...

卡特兰数(Catalan Number) 算法、数论 组合~

Catalan number,卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列。以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名。卡特兰数的前几个数 前20项为(...

斐波那契数列第n项的高效解法

参考书籍《剑指Offer》 常见解法谈及斐波那契数列,我们直接就可以想到f(n)=f(n-1)+f(n-2)。于是做出如下解:long long Fibonacci(unsigned int n) {...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:统计数组中不同元素出现的次数(时间复杂度O(n),空间复杂度o(1))
举报原因:
原因补充:

(最多只允许输入30个字)