首页 > 其他分享 >Day 33 动态规划 Part10

Day 33 动态规划 Part10

时间:2024-08-15 23:27:32浏览次数:6  
标签:nums 33 max Part10 len int length Day dp

300. 最长递增子序列

动态规划的版本是挺好理解的,dp[i]代表了以第i个数字结尾的最长递增子序列的长度,dp[0]显然为1。dp如何更新呢? i > 0: dp[i] = 在i之前,最大的小于nums[i]的数nums[j] dp[i] = dp[j] + 1,所以就是需要找到比nums[i]小的最大的数,遍历就可以得到。

class Solution {
    public int lengthOfLIS(int[] nums) {
        int[] dp = new int[nums.length];
        Arrays.fill(dp, 1);
        for(int i = 1; i < nums.length; i++)
            for(int j = 0; j < i; j++)  //找到比nums[i]小的
                if(nums[i] > nums[j]) dp[i] = Math.max(dp[i], dp[j] + 1);
        int max = 0;
        for(int num : dp) max = Math.max(num, max);
        return max;
    }
}

这个题解我也真是不想写了,心里好乱。看别人的题解吧,写的很清楚。

class Solution {
    public int lengthOfLIS(int[] nums) {
        int[] l = new int[nums.length + 1];  
        // l[i]代表可以形成长度为i的递增序列的末尾的最小值
        // 例如[2, 5, 3]可以形成长度为2的序列中[2, 3], [2, 5]末尾可以选3,或5,最小值为3,此时l[2] = 3
        int len = 1;
        l[1] = nums[0]; // l并非一开始就确定下来,而是不断的更新,代表了已经遍历的数组中的满足上述定义的l数组
        for(int i = 1; i < nums.length; i++){
            if(nums[i] > l[len]) l[++len] = nums[i];  // 当遇到大于序列末尾最大值时,说明序列还能更长,更新l数组和len
            else{
                l[binarySearch(l, 1, len, nums[i])] = nums[i];  // 找到l数组中,第一个大于当前
            } 
        }
        return len;
    }
    public int binarySearch(int[] l, int left, int right, int val){ // 左闭右闭,找到第一个大于val的位置
        while(left <= right){
            int mid = (left + right) / 2;
            if(l[mid] == val) return mid;
            if(l[mid] > val) right = mid - 1;
            else left = mid + 1;
        }
        return left;
    }
}

674. 最长连续递增序列

class Solution {
    public int findLengthOfLCIS(int[] nums) {
        int max = 1, len = 1;
        for(int i = 1; i < nums.length; i++){
            if(nums[i] > nums[i-1]) max = Math.max(max, ++len);
            else len = 1;
        }
        return max;
    }
}

718. 最长重复子数组

我都不知道我为什么要死磕那个滑动窗口的版本,虽然硬调出来了,但这要一次写出来不犯错对我来说有点不可能。动态规划这个多好啊,清清楚楚,不容易犯错。下次别这样了。

class Solution {
    public int findLength(int[] nums1, int[] nums2) {
        int ans = 0;
        int n1 = nums1.length, n2 = nums2.length;
        int[][] dp = new int[n1+1][n2+1];
        for(int i = n1 - 1; i >= 0; i--){
            for(int j = n2 - 1; j >= 0; j--){
                dp[i][j] = nums1[i] == nums2[j] ? dp[i+1][j+1] + 1 : 0;
                ans = Math.max(ans, dp[i][j]);
            }
        }
        return ans;
    }
}

标签:nums,33,max,Part10,len,int,length,Day,dp
From: https://www.cnblogs.com/12sleep/p/18362052

相关文章

  • (路由卷1)-33-路由环路解决方案
    实验:r1:intlo0ipadd1.1.1.1255.255.255.255ints1/0noshipadd12.1.1.1255.255.255.0routerripver2noaunet12.0.0.0.0r2:intlo0ipadd2.2.2.2255.255.255.255ints1/0clockrate64000ipadd12.1.1.2255.255.255.0intf0/0noshipadd24.......
  • 代码随想录Day16
    513.找树左下角的值给定一个二叉树的根节点root,请找出该二叉树的最底层最左边节点的值。假设二叉树中至少有一个节点。示例1:输入:root=[2,1,3]输出:1示例2:输入:[1,2,3,4,null,5,6,null,null,7]输出:7提示:二叉树的节点个数的范围是[1,104]-231<=......
  • 输出流FileOutputStream day16
    packagecom.shujia.day16.ketang;importjava.io.File;importjava.io.FileOutputStream;/*IO流:输入输出流按照流向划分:输入流:将外部存储数据-->java输出流:java-->外部存储工具中按照类型划分:字节流(万......
  • Day01
    MarkDown学习标题三级标题字体hollow,Word!hollow,Word!hollow,Word!hollow,word!引用选择狂炫说Java,走向人生巅峰分割线图片超链接点击跳转到列表ABCABC表格名字性别生日张三男1997.1.1代码public......
  • day04(C高级)编译工具
    编译工具一.gcc编译工具预处理:#开头内容,展开头文件,替换宏定义,不会进行语法检查。gcc-Exx.c-oxx.i编译:检查语法错误,词法错误,将.i文件转换成.s汇编文件。gcc-Sxx.i-oxx.s汇编:将汇编文件转换成二进制文件(不可执行)gcc-cxx.s-oxx.o链接:链接库文件,将不可执......
  • [ABC338E] Chords
    原题链接题解对于\(a_i,b_i\),如果存在一个\(j\),使得\(a_j\in[a_i,b_i],b_j\notin[a_i,b_i]\),则存在交叉点即对于\([a_i,b_i]\)这一匹配,其内部的点也必然一一匹配,否则存在一个匹配点在外面,会导致交叉有点像括号匹配,我们可以用栈解决在这个思路下,我们要确保\(a_i<b_i\)......
  • 实训日记day29
    MySQL读写分离1、读写分离的目的数据库负载均衡:当数据库请求增多时,单例数据库不能够满足业务需求。需要进行数据库实例的扩容。多台数据库同时相应请求。也就是说需要对数据库的请求,进行负载均衡但是由于数据库服务特殊原因,数据库扩容基本要求为:数据的一致性和完整性......
  • C语言学习笔记 Day13(复合类型/自定义类型)
    Day13 内容梳理:目录Chapter9 复合类型(自定义类型)9.1结构体(1)结构体变量定义、初始化(2)嵌套结构体(3)结构体赋值(4)结构体和指针(5)结构体做函数参数9.2共用体(联合体)9.3枚举9.4typedef关键字Chapter9 复合类型(自定义类型)9.1结构体有时需要将不同类型的数组......
  • 洛谷题单指南-常见优化技巧-P2866 [USACO06NOV] Bad Hair Day S
    原题链接:https://www.luogu.com.cn/problem/P2866题意解读:每个牛能看到的右边比他矮的牛,直到有比他高的挡住为止,因此只用找每个牛右边第一个比他高的牛的位置即可计算中间比他矮的有多少。解题思路:典型的单调栈应用,注意,常规的单调栈可以用来:1、找每个数左边第一个比他小的数的......
  • 苍穹外卖项目DAY03
    苍穹外卖项目Day031、菜品管理1.1、公共字段自动填充1.1.1、问题分析业务表中的公共字段:问题:代码冗余、不便于后期维护1.1.2、实现思路自定义注解AutoFill,用于标识需要进行公共字段自动填充的方法自定义切面类AutoFillAspect,统一拦截加入了AutoFill注解的方法,通过......