这个系列没啥花头,就是纯 leetcode 题目拆解分析,不求用骚气的一行或者小众取巧解法,而是用清晰的代码和足够简单的思路帮你理清题意。让你在面试中再也不怕算法笔试。
28. 缺失的第一个正数 (first-missing-positive)
标签
- hash map
- 困难
题目
这里不贴题了,leetcode打开就行,题目大意:
找到缺失的第一个正整数。
基本知识
使用hashMap 用空间换时间。 关于Map简易用法看这里
基本思路
为了减少时间复杂度,可以把 input 数组都装到 map 中,然后 j 循环从 1 开始,依次比对 map 中是否存在 j,只要不存在 j 就立即返回结果。
步骤
- 把 input 数组都装到 map 中,形成映射表
- 因为要正整数,所以从1开始比对,发现map中是否存在 j, 只要不存在 j 就立即返回结果。
- 如果是 [] , 或者 [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打开就行,题目大意:
给定一个没有重复数字的序列,返回其所有可能的全排列。
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
基本思路
经典问题。本质还是 DFS + 回溯
写法实现
/**
* @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,我看到就通过,暗号对不上不加哈,加了之后我会尽我所能帮你,但是注意提问方式,建议先看这篇文章:提问的智慧