使用o{n}的时间复杂度和o{1}的空间复杂度统计长度为n的数组中【1-n】每个元素出现的个数

117 阅读1分钟

使用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);

一开始是统计出现两次的问题,后来想了一下,可以更通用的统计每个元素出的次数,就写了个通用的 思路就是用复数来统计元素的个数