前端算法面试必刷题系列[16]

333 阅读2分钟

这个系列没啥花头,就是纯 leetcode 题目拆解分析,不求用骚气的一行或者小众取巧解法,而是用清晰的代码和足够简单的思路帮你理清题意。让你在面试中再也不怕算法笔试。

28. 缺失的第一个正数 (first-missing-positive)

标签

  • hash map
  • 困难

题目

leetcode 传送门

这里不贴题了,leetcode打开就行,题目大意:

找到缺失第一个整数。

基本知识

使用hashMap 用空间换时间。 关于Map简易用法看这里

基本思路

为了减少时间复杂度,可以把 input 数组都装到 map 中,然后 j 循环从 1 开始,依次比对 map 中是否存在 j,只要不存在 j 就立即返回结果。

步骤

  1. 把 input 数组都装到 map 中,形成映射表
  2. 因为要正整数,所以从1开始比对,发现map中是否存在 j, 只要不存在 j 就立即返回结果。
  3. 如果是 [] , 或者 [1] 这种,直接返回 len + 1

写法实现

/**
 * @param {number[]} nums
 * @return {number}
 */
var firstMissingPositive = function(nums) {
  let numMap = new Map(), 
  len = nums.length
  // 把nums都装到map中
  for (let i = 0; i < len; i++) {
    numMap.set(nums[i], nums[i])
  }
  // 直接从1开始,发现第一个对不上的直接返回下标就行
  for (let j = 1; j < len + 1; j++) {
    if (numMap.get(j) !== j) {
      return j
    }
  }
  return len + 1
};

console.log(firstMissingPositive([1]))

29. 全排列 (permutations)

标签

  • DFS
  • 回溯
  • 中等

题目

leetcode 传送门

这里不贴题了,leetcode打开就行,题目大意:

给定一个没有重复数字的序列,返回其所有可能的全排列

输入: [1,2,3] 输出:

[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

基本思路

经典问题。本质还是 DFS + 回溯

这篇2道思想相同

写法实现

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var permute = function(nums) {
  let [res, len] = [[], nums.length]
  let dfs = (curPath) => {
    if (curPath.length === len) {
      res.push(curPath.slice())
      return
    }
    for (let i = 0; i < len; i++) {
      if (!curPath.includes(nums[i])) {
        curPath.push(nums[i])
        dfs(curPath)
        curPath.pop()
      }
    }
  }
  dfs([])
  return res
};

console.log(permute([1,2,3]))

可以稍加改进,用空间换时间,使用一个 当前用过的(curUsed)对象来记录已使用过的就不用 Array.prototype.includes

var permute = function(nums) {
  let [res, len, curUsed] = [[], nums.length, {}]
  let dfs = (curPath) => {
    if (curPath.length === len) {
      res.push(curPath.slice())
      return
    }
    for (let i = 0; i < len; i++) {
      // 已使用过直接跳过
      if (curUsed[nums[i]]) {
        continue;
      }
      curPath.push(nums[i])
      curUsed[nums[i]] = true
      dfs(curPath)
      curPath.pop()
      curUsed[nums[i]] = false
    }
  }
  dfs([])
  return res
};

console.log(permute([1,2,3]))

另外向大家着重推荐下这位大哥的文章,非常深入浅出,对前端进阶的同学非常有作用,墙裂推荐!!!核心概念和算法拆解系列

今天就到这儿,想跟我一起刷题的小伙伴可以加我微信哦 搜索我的微信号infinity_9368,可以聊天说地 加我暗号 "天王盖地虎" 下一句的英文,验证消息请发给我 presious tower shock the rever monster,我看到就通过,暗号对不上不加哈,加了之后我会尽我所能帮你,但是注意提问方式,建议先看这篇文章:提问的智慧