题目描述
一个长度大小为N的数组,数组中的每个元素的取值范围在[1,N],且为正整数。
问:如何在时间复杂度为O(N),空间复杂度为O(1)的条件下,统计数组中不同元素出现的次数。
对这道题的感受
一开始接触到这道题,我是觉得不难的,因为我会开辟一个辅助数组来帮助统计这个过程。但是这道题要求的是空间复杂度为O(1),然后这道题的难度就噌噌噌的上升,然后我现在弄明白了就来写一下我对这道题的题解吧。
解题思路
遍历数组,通过当前元素的值作为下标,找到下一个元素。最后得到的数组中,下标(因为数组的下标都是从0开始的,所以需要+1)为数组中出现的元素,每个下标对应的值取反输出即是该元素出现的次数。
- 若当前元素小于0,则跳过
- 若当前元素大于0,则判断其作为下标对应的元素是否大于0。若大于0,则把对应的元素赋值给当前元素,并把它的值设置为-1;若小于0,则把对应的元素自减1,当前元素置为0;
估计阅读到这里,你会一脸懵逼,这些当前元素和对应元素到底是什么鬼,好混。我明白,所以接下来我举个例子来讲解整个过程。
1 | // 数组举例 |
代码
1 | package Test; |
运行截图
题外话
今天一睡醒就一直在家帮忙,也没啥时间可以刷题,偶尔看会小说和刷抖音,颓废了一点,就写一些以前接触过的题,也挺有意思的。觉得博主写得还可以的点点赞,关注一下,谢谢大家的支持了~~~