首页 > 其他分享 >动态规划之最长递增子序列

动态规划之最长递增子序列

时间:2022-09-28 11:31:39浏览次数:54  
标签:nums int 递增 前面 result 序列 最长 dp

给你一个整数数组 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

思路:

1)dp[i]的下标及含义

  • 第i个数的最大子序列长度为dp[i];

2)递推公式

  • 我们的dp[i]可以由前面的某个值推导出来,注意是前面的某个值。而不是前面的这个值。
    if (dp[i] > dp[j]) dp[i] = Math.max(dp[i], dp[j] + 1)
    dp[i]和前面的 一个数比完,值就会改变,所以要和dp[j] + 1取最大值。
  • 如果这个数都比前面的小,那就没必要处理了,让它保持原值就行,反正最后结果都会把它过滤掉。

3)数组初始化

  • 都为1就行

4)遍历顺序

  • 从前往后

5)举例推导

  • 在纸上写出来

代码

1 class Solution {
2 public int lengthOfLIS(int[] nums) {
3 int len = nums.length;
4 // 边界条件处理
5 if (len == 1) return 1;
6 int[] dp = new int[len];
7 // 初始化dp数组
8 // 每一个位置的初始值都应该为1
9 Arrays.fill(dp, 1);
10 dp[0] = 1;
11 for (int i = 1; i < len; i++) {
12 for (int j = 0; j < i; j++) {
13 if (nums[i] > nums[j]) {
14 // 注意这里,不是由前面一个数推导出来的,而是前面的某个数,只要大于前面某个数,那就+1来比较
15 // dp[i]每和前面一个数比完,都会变化,所以要取最大值
16 dp[i] = Math.max(dp[i], dp[j] + 1);
17 }
18 }
19 }
20 int result = 0;
21 for (int i = 0; i < dp.length; i++) {
22 result = result > dp[i] ? result : dp[i];
23 }
24 return result;
25 }
26

 

总结

  • 不要局限了自己的思想,被以前的经验束缚住。比如本题,得跳出去,不是由前一个数推导来的,而是前面某个数。

标签:nums,int,递增,前面,result,序列,最长,dp
From: https://blog.51cto.com/u_15810109/5719091

相关文章

  • 895. 最长上升子序列
    最基础的最长上升子序列问题这里用的是dp做法定义f[i]为从1~i的所有上升子序列最大的长度双重循环,以a[i]为最后一个数,枚举所有小于a[i]的数a[j]作为倒数第二个数,对于所......
  • 序列化之Serializer
    常用字段类和字段参数1.CharFieldBooleanFieldIntegerFieldDecimalField2.返回格式ListField:{hobby:['篮球','足球']}DictField:{wife:{'name':'barry'}}......
  • drf之模型类序列化器ModelSerialize
    序列化常用字段charFieldBooleanFieldIntegerFieldDecimaField#ListField:{name:'summer',hobby:[1,2,3,4]}#DictField:{nane:'summer',wife:{'name':'哈哈哈'}}......
  • Serializer序列化与ModelSerializer序列化
    Serializer序列化与ModelSerializer序列化序列化类高级用法之cource,修改序列化字段名字用法一使用cource的时候,字段参数可以指定序列化哪个参数,如果指定别人的字段那......
  • drf序列化类
    目录序列化类常用字段类和字段参数1.常用字段2.常用字段参数2.1.给CharField字段类使用的参数2.2.给IntegerField字段类使用的参数2.3.通用参数2.4.重点序列化类高级用法之......
  • 序列化类常用字段类和字段参数、序列化类高级用法之source、序列化类高级用法之定制序
    目录序列化类常用字段和字段参数常用字段类需要记住的字段类常用字段参数序列化类高级用法之source,修改序列化字段名字序列化类高级用法之定制序列化字段的俩种方式方式一......
  • drf ModelSerializer模型类序列化器
    序列化类的常用字段类和字段类参数 序列化类的常用字段类和字段类参数序列化类的字段类字段名=serializers.字段类型(字段参数)主要的字段类CharFieldBoolean......
  • 今日内容 序列化类的高级用法
    序列化类常用字段类和字段参数常用字段类型:字段字段构造方式BooleanFieldBooleanField()NullBooleanFieldNullBooleanField()CharFieldCharField(......
  • 【Django-rest-framework框架】第03回 序列化类字段与高级用法
    目录1.序列化类常用字段与字段参数1.1常用字段类型1.2选项参数1.3通用参数2.序列化类高级用法之sourse2.1source可以指定序列化表中得哪个字段2.2source如果是方......
  • 单链表的递增排序
    voiesort(LinkList&L){LNode*p=L->next;LNode*pre;LNode*r=p->next;p->next=NULL;p=r;while(p!=NULL){r=p......