【筆記】JavaScript版數據結構與算法——基礎算法之“排序類”(41. 缺失的第一個正數)


缺失的第一個正數

1.題目

41. 缺失的第一個正數 - 力扣(LeetCode)

給你一個未排序的整數數組,請你找出其中沒有出現的最小的正整數。

示例 1

輸入: [1,2,0]
輸出: 3

示例 2:

輸入: [3,4,-1,1]
輸出: 2

示例 3:

輸入: [7,8,9,11,12]
輸出: 1

提示:

  • 你的算法的時間複雜度應爲O(n),並且只能使用常數級別的額外空間。

題目模板

/**
 * @param {number[]} nums
 * @return {number}
 */
var firstMissingPositive = function(nums) {

};

2.思路分析

見題解

3.所用到的方法

見題解

4.題解及優化

我的題解

let firstMissingPositive = nums => {
  if (!nums.length) nums = [0] // 避[]
  nums.sort((a, b) => a - b)
  // +1避免i取不到類似[1,2,3]的結果4
  for (let i = 1; i <= nums.length + 1; i++) { 
    if (!nums.includes(i)) {
      return i
    }
  }
  return 0 // 謹慎起見可加
}

在這裏插入圖片描述

課程解法

let firstMissingPositive = nums => {
  // 過濾掉非正整數
  nums = nums.filter(item => item > 0)
  // 正整數數組是不是爲空
  if (nums.length) {
    // 升序,方便從左到右取最小值arr[0]
    nums.sort((a, b) => a - b)
    // 如果第一個元素不爲1,返回1
    if (nums[0] !== 1) {
      return 1
    } else {
      // 從左邊開始遍歷,只要下一個元素和當前元素差值>1說明當前元素的下一個值(+1)
      for (let i = 0; i < nums.length - 1; i++) {
        if (nums[i + 1] - nums[i] > 1) {
          return nums[i] + 1
        }
      }
      // 如果數組是連續的正整數[1,2,3,4,5,6]
      return nums.pop() + 1
    }
  } else {
    return 1
  }
}

在這裏插入圖片描述
使用選擇排序:

let firstMissingPositive = nums => {
  nums = nums.filter(item => item > 0)
  // 實現選擇排序,先拿到最小值,如果第一個元素不是1直接返回1,如果是1,就要比相鄰元素差值
  for (let i = 0, len = nums.length, min; i < len; i++) {
    min = nums[i]
    for (let j = i + 1; j < len; j++) {
      if (nums[j] < min) {
        let c = min
        min = nums[j]
        nums[j] = c
      }
    }
    nums[i] = min
    if (i > 0) {
      if (nums[i] - nums[i - 1] > 1) {
        return nums[i - 1] + 1
      }
    } else {
      if (min !== 1) {
        return 1
      }
    }
  }
  return nums.length ? nums.pop() + 1 : 1
}

在這裏插入圖片描述

其他小夥伴的解法

https://leetcode-cn.com/problems/first-missing-positive/solution/41-que-shi-de-di-yi-ge-zheng-shu-by-alexer-660/

拓展:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章