算法复习

103 阅读1分钟

由于公司不给力,干完活就被优化了。正好也重新刷下算法,并记录下

回溯

公式(本质上是递归并回退)

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就是贪心加二分 最长子序列