缺失的最小正数/数字

92 阅读1分钟

leetcode第41道题

image.png

解决方案:

function findMissingPositive (arr) {
  for (let i = 0, len = arr.length; i < len; i++) {
    // 如果数组中的数字已经在它合理的位置,则i===arr[i]-1
    // 每次while循环之后,arr[i]中的值有三种状态:1.已处于正确位置、2.负数、3. 值过大
    while (arr[i] > 0 && arr[i] < arr.length && (arr[i] !== arr[arr[i] - 1])) {
      let index = arr[i] - 1;
      [arr[i], arr[index]] = [arr[index], arr[i]];
    }
  }

  for (let i = 0, len = arr.length; i < len; i++) {
    if (arr[i] !== i + 1) {
      return i + 1;
    }
  }

  return arr.length
}

思想:排序,但是又不是真正的排序,如果按照传统方案进行排序,则算法复杂度会升高,这里利用数组的索引与数组中值的对应关系来不断交换数组的值。针对寻求缺失数据的问题,也可以用这种方法解决