需要找出子问题,然后通过解决一个一个子问题,进一步结果所有问题,
第一、这个问题要能够进行拆解;
第二、这些小问题要能够被解决
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]
};