过年自律第七天

282 阅读2分钟

如果不小心网友来到了这里请网友自动飘走,浪费你们时间表示歉意。该系列博客的目的是:想自己作为自律工具趁着过年没事每天刷几道题作为打卡督促的功能,没有什么可参考学习的东西,也不是刷博客量充大佬的目的

2021放假第七天,2月12日

递归

题号:21
function ListNode(val, next) {
    this.val = (val === undefined ? 0 : val)
    this.next = (next === undefined ? null : next)
}
//再简单的递归问题也不能在脑子中去绘制递归的每一步,容易走火入魔,也是不正常的思考方式
//递归是一个长龙,中间看一个过程,末尾(出口)看一下就行了
var mergeTwoLists = function (l1, l2) {
    if (l1 == null) {
        return l2
    }
    if (l2 == null) {
        return l1
    }
    if (l1.val < l2.val) {
        l1.next = mergeTwoLists(l1.next, l2)
        return l1
    } else {
        l2.next = mergeTwoLists(l1, l2.next)
        return l2
    }
};
题号:面试题0806
var hanota = function (A, B, C) {
    helper(A.length, A, B, C)
};
//递归的ab,c是通过参数下发的要小心我们处理的ab,c和原始的ab,c的不一样
function helper(num, a, b, c) {
    if (num == 1) {
        //把a最上一个挪到b
        c.unshift(a.shift())
        return
    }
    //递归的核心逻辑
    //当2层的时候推演一下
    //当3层的时候推演一下
    //真不行再推演4层的时候
    //发现规律,在n>2的时候和n=2一样(压缩饼干),把n以上的层数压缩为1层考虑
    //那么递归的每一次处理逻辑就是:怎么把n以上的n-1层借助可用的柱子移动出来
    //漏出最后一层,把最后一层就一个,直接挪过去即可
    helper(num - 1, a, c, b)
    //把a最上一个挪到c
    c.unshift(a.shift())
    //把b最上移动到c
    helper(num - 1, b, a, c)

}
题号:剑指offer10-1
//纯递归超时
var fib = function (n) {
    if (n == 0) {
        return 0
    }
    if (n == 1) {
        return 1
    }
    return (fib(n - 1) + fib(n - 2)) % 1000000007
};

//动态规划
var fib = function (n) {
    //这里状态压缩我只需要记录2个状态,那么就开辟1个max为2的数组记录即可
    let dptable = []
    for (let i = 0; i <= n; i++) {
        if (i == 0) {
            dptable.unshift(0)
        } else if (i == 1) {
            dptable.unshift(1)
        } else {
            dptable.unshift((dptable[0] + dptable[1]) % 1000000007)
            dptable.pop()
        }
    }
    return dptable.shift()
};