由于公司不给力,干完活就被优化了。正好也重新刷下算法,并记录下
回溯
公式(本质上是递归并回退)
1.需要全部的路径
let list =[];
function backtrack(list,临时路径,输入){
结束条件:
临时路径,新增一个路径
循环:{
选择一个数据(选择其他数据)
递归 backtrack(list,临时路径,输入)
撤回选择的数据
}
}
backtrack(list)
...
2.不需要全部路径,只要true或者false
tip:去除临时路径就行
leetcode46
var permute = function(nums) {
let list =[];
backtrack(list,[],nums)
return list
};
function backtrack(list,temp,nums) {
if (temp.length === nums.length) {
return list.push([...temp])
}
for (const num of nums) {
if (temp.includes(num)) {
continue
}
temp.push(num)
backtrack(list,temp,nums)
temp.pop()
}
}
leetcode79
var exist = function(board, word) {
if (board.length ===0) {
return false
}
if (word.length ===0) {
return true
}
//开始循环
let row =board.length
let col = board[0].length
for (let i = 0; i < row; i++) {
for (let j = 0; j < col; j++) {
//每一个字母作为起点搜索
const ret =find(i,j,0) //0为索引
if (ret) {
return ret
}
}
}
return false
//递归函数
function find(i,j,cur) {
if (i>=row || i<0) {
return false
}
if (j>=col || j<0) {
return false
}
let letter =board[i][j];
//不匹配路线
if (letter !==word[cur]) {
return false
}
if (cur === word.length-1) {
return true
}
board[i][j] =null //选择当前字母
const ret =find(i+1,j,cur+1) ||
find(i-1,j,cur+1) ||
find(i,j-1,cur+1) ||
find(i,j+1,cur+1)
board[i][j] =letter
return ret
}
};
贪心
每一步都选择当前最优解,跟之前的选择没关系
1.找5000零钱最少张数 50 20 10 5
2.每次都给最大值,最终得到解
leetcode55 跳跃游戏
给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标。
var canJump = function(nums) {
let cover =0;
for (let i = 0; i <= cover; i++) {
cover =Math.max(cover,i+nums[i])
if (cover >=nums.length-1) {
return true
}
}
return false
};
leet455 分发饼干
var findContentChildren = function(g, s) {
g= g.sort((a,b)=>a-b);
s= s.sort((a,b)=>a-b);
let ret =0;
let index =s.length-1;
for (let i = g.length; i >=0; i--) {
if (index>=0 && s[index]>=g[i]) {
ret++
index--
}
}
return ret
};
动态规划
求极限
1.炒股票,每天股价不一样
2.根据时间段匹配最大值
vue dom diff就是贪心加二分 最长子序列