发布时间: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;
}