每日一道算法Day25

82 阅读1分钟

题目描述:

image.png

大致思路:

根据题目限制的条件, 最简单的排序思路是行不通了。 并且不能使用新的数组空间, 所以这里的想法是利用数组的下标来做文章。大致就是将数组中大于0的元素按照数组下标来调换顺序。

举个栗子:

目标数组: [1, 0, 5, 4, 7] 转换后: [0, 1, 0, 0, 4, 5, , 7]

代码如下:

 const len = nums.length;
  for (let i = 0; i < len; ++i) {
    //while 循环 将当前值替换为当前索引值, 并且判断 nums[i] !== nums[nums[i]]防止死循环
    while (nums[i] > 0 && nums[i] !== i && nums[i] !== nums[nums[i]]) {
      const val = nums[i];
      const tmp = nums[i];
      // 当val大于数组长度时用0填充, 跳出while循环
      nums[i] = nums[val] ?? 0;
      nums[val] = tmp;
    }
  }

遍历转换后的数组, 如果当前值与当前索引不同, 则该值为最小正整数, 否则返回转换后的数组长度, 即数组中最大元素 + 1

代码如下:

 for (let i = 0; i < nums.length; ++i) {
    if (nums[i] !== i && i > 0) {
      return i;
    }
  }
 return nums.length;