使用o{n}的时间复杂度和o{1}的空间复杂度统计长度为n的数组中【1-n】每个元素出现的个数
/**
* 题目描述:长度为n的数组中,存储【1-n】之间的元素,有些元素可能出现一次,有些元素可能出些多次,求出现两次的元素
* 要求:时间复杂度为o{n},空间复杂度为o{1}
* 数组中
*/
function countEle(nums: number[]) {
let i = 0;
while (i < nums.length - 1) {
if (nums[i] <= 0) {
i++;
continue;
}
if (i === nums[i] - 1) {
nums[i] = -1;
} else {
if (nums[nums[i] - 1] <= 0) {
nums[nums[i] - 1] = nums[nums[i] - 1] - 1;
nums[i] = 0;
} else {
nums[i] = nums[nums[i] - 1];
nums[nums[i] - 1] = -1;
}
}
}
return nums;
}
function getEleByCounter(nums: number[], c): number[] {
return countEle(nums).reduce((acc, item, index) => {
if (Math.abs(item) === c) {
acc.push(index + 1);
}
return acc;
}, []);
}
const count = countEle([2, 2, 4, 4, 5, 6, 4, 9, 9]);
const eleCount = getEleByCounter([2, 2, 4, 4, 5, 6, 4, 9, 9], 2);
一开始是统计出现两次的问题,后来想了一下,可以更通用的统计每个元素出的次数,就写了个通用的 思路就是用复数来统计元素的个数