()统计数组中各个元素出现的次数,元素取值范围为:1到N

发布时间:2023-09-26 09:30

我太难了,还是没看懂这题的解法,如果有大佬知道的话请不吝赐教!救救孩子吧

问题描述:

//给定一个数组a,长度为N,元素取值范围为[1, N]
//统计各个元素出现的次数,要求时间复杂度为O(N),空间复杂度为O(1)
//可以改变原来的数组结构

解题思路

//1.从第一个元素开始遍历,每遍历到一个元素,将(该元素值-1 记为index)作为一个下标值,令该下标对应的元素值为元素index+1出现的次数
//2.若下标index为负值,说明该元素已处理过,跳过
//3.判断,若a[index]为正,则赋初值-1;若为负,则执行减1操作
//4.最后,数组中存储的元素即为统计次数,而该元素对应的下标+1即为元素值

#include 
#include 

using namespace std;

void PrintArr(int * arr)
{
	for (int i = 0; i < 2; i++)
	{
		cout << arr[i] << \" \";
	}
	cout << endl;
}

int main()
{
	int n = 2;
	int* a = new int[]{1,1};
	int i = 0;

	while (i < n)
	{
		int tmp = a[i] - 1;
		if (tmp < 0)   //表示该元素已经处理过了,跳过
		{
			i++;
			continue;
		}
		else if (a[tmp] > 0)  //第一次处理一个值
		{
			a[i] = a[tmp]; //暂存新元素
			a[tmp] = -1;
		}
		else
		{
			a[i] = 0;  //没有新的元素要处理,置0
			a[tmp]--;
		}

		PrintArr(a);
	}

	for (int j = 0; j < n; ++j)
	{
		cout << j + 1 << \", \" << -a[j] << \"\\t\";
	}
	cout << endl;
}

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号