JavaScript 对 leetcode 刷题之动态规划(持续更新)

682 阅读4分钟

需要找出子问题,然后通过解决一个一个子问题,进一步结果所有问题,

第一、这个问题要能够进行拆解;

第二、这些小问题要能够被解决

300. 最长递增子序列

这道题是通过,建立一个列表用来记录到达当前位置时候的最大递增子序列,

然后进行一一比较,

如果目前的坐标对应元素值,大于最大递增子序列中的值对应的元素值的时候,

就对当前坐标的元素值进行修改,最大递增子序列中的值对应的元素值+1.

就是说有两个数组 一个是 题目给的,一个是我们建立的

整数数组对应子序列的数组

两个有个共性就是,两个数组对应的下标是统一的。

利用这个同性再加上一个性质

就是继承性,因为题目要求的是,递增序列,也就是当这个数大于之前的某个数的时候,

就可以把他对应的长度,给继承下来,然后变长+1

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

示例 1:

输入:nums = [10,9,2,5,3,7,101,18] 输出:4 解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。 示例 2:

输入:nums = [0,1,0,3,2,3] 输出:4 示例 3:

输入:nums = [7,7,7,7,7,7,7] 输出:1

提示:

1 <= nums.length <= 2500 -104 <= nums[i] <= 104

进阶:

你可以设计时间复杂度为 O(n2) 的解决方案吗? 你能将算法的时间复杂度降低到 O(n log(n)) 吗?

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/lo… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

354. 俄罗斯套娃信封问题

这道题目也是使用动态规划,

首先分析一下题目,题目需要的是每一个信封能够不断进行嵌套,

然后只要后一个信封的宽和高都大于前一个的话,就套进去。

所以,首先就对信封进行排序,

对宽进行排序,排序中如果宽相同,就按高进行排序。

对已经排序好的数组,

从第二个信封开始对之前的信封进行查找,

如果之前的信封存在宽和高都大于它的话,

就对遍历记录的数据加在之前的记录上加一。

给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度。

当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。

请计算 最多能有多少个 信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。

注意:不允许旋转信封。

示例 1:

输入:envelopes = [[5,4],[6,4],[6,7],[2,3]] 输出:3 解释:最多信封的个数为 3, 组合为: [2,3] => [5,4] => [6,7]。 示例 2:

输入:envelopes = [[1,1],[1,1],[1,1]] 输出:1

提示:

1 <= envelopes.length <= 5000 envelopes[i].length == 2 1 <= wi, hi <= 104

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ru… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

/**
 * @param {number[][]} envelopes
 * @return {number}
 */
var maxEnvelopes = function(envelopes) {
// 动态规划
// 首先要先进行排序
// 接着用一个来进行记录
// 最后找出最大值
    // 按照从小到大进行排序,然后第二位也是这样子
    var code = []
    if(envelopes.length == 1){
        return 1
    }
    var envelopes = envelopes.sort((a,b)=>{
        if(a !== b){
            return a[0] - b[0]
        }else{
            return a[1] - b[1]
        }
    })
    var tem_envelopes = envelopes[0]
    //然后找出里面最长的卡牌进行继承,什么时候进行继承呢?就是当目前的卡牌大于之前的卡牌的宽和高的时候,就把之前进行继承并且加上1
    for(var i = 0;i < envelopes.length;i++){
        code[i] = 0
        for(var j = 0;j <= i;j++){
            if(envelopes[i][0] > envelopes[j][0] && envelopes[i][1] > envelopes[j][1]){
                code[i] = Math.max(code[i],code[j])
            }
        }
        code[i]++
    }
    code = code.sort((a,b) => {return b - a})
    return code[0]
};