当前位置: 首页 > article >正文

Leetcode Java学习记录——动态规划基础_2

要理解复杂逻辑的关键

  1. 分治出子问题
  2. dp方程
  3. 合并子问题的解
  4. 自底向上递推

最长公共子序列

两个字符串的变化问题,常可以转化成二维数组。

给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。
一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。
例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。
两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。

class Solution {
    public int longestCommonSubsequence(String text1, String text2) {
        int m = text1.length() , n =text2.length();
        int[][] dp = new int[m+1][n+1];
        for(int i = 1; i<=m ; i++){
            char c1 = text1.charAt(i-1);
            for(int j=1 ; j <= n; j++){
                char c2 = text2.charAt(j-1);
                if ( c1 == c2 ){
                    // dp[i][j] = 1 + Math.max(dp[i-1][j] , dp[i][j-1]);
                    dp[i][j] = 1 + dp[i-1][j-1];
                }else{
                    dp[i][j] = Math.max(dp[i-1][j] , dp[i][j-1]);
                }
            }
        }
        return dp[m][n];
    }
}

三角形最小路径和

题目

120.给定一个三角形 triangle ,找出自顶向下的最小路径和。

每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。

代码细节

  1. List 要用.size()
    int[] 要用length
  2. Arrays.fill(cur,1); 可以用来操作 int[] cur.
  3. int[]默认新建出来都是0.
    Integer 新建出来则是null

解答

下面的代码仍有一处问题,你看得出来吗?

class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
    	//注意初始化写法
        // int[] cur = new int[triangle.length];
        //int[] cur = triangle[triangle.size() - 1];
        int[] cur = new int[triangle.size()+1];
        
        // 注意边界写成哪一行
        // for(int i = triangle.size()-2; i>=0; i--)
        for(int i = triangle.size()-1 ; i>=0; i--){
            for(int j = triangle.get(i).size()-1; j>=0 ; j--){
                 cur[j] = Math.min(cur[j],cur[j+1]) + triangle.get(i).get(j);
            }
        }
        return cur[0];
    }
}

正确代码为:

   public int minimumTotal(List<List<Integer>> triangle) {
        int[] cur = new int[triangle.size()+1];
        // 注意边界写成哪一行
        for(int i = triangle.size()-1 ; i>=0; i--){
            for(int j = 0; j<triangle.get(i).size() ; j++){
                cur[j] = Math.min(cur[j],cur[j+1]) + triangle.get(i).get(j);
            }
            // for(int j = triangle.get(i).size()-1; j>=0 ; j--){
            //     cur[j] = Math.min(cur[j],cur[j+1]) + triangle.get(i).get(j);
            // }
        }
        return cur[0];
    }

上段代码错误在于单行处理时从右到左更新,但表达式中用到了[j+1],就会用到已更新过的值。
dp更新时,要根据dp方程的内容判断更新顺序(从左往右还是从右往左)。


http://www.kler.cn/a/281197.html

相关文章:

  • Python | Leetcode Python题解之第378题有序矩阵中第K小的元素
  • EmguCV学习笔记 VB.Net 6.4 霍夫变换
  • eclipse下载安装与配置代码补全与中文版
  • 微软推出全新多语言高质量Phi-3.5语言模型
  • Vue组件的好处和理解、基本使用、注意事项、组件嵌套、VueComponent理解和原型链
  • Sweet Home 3D:Mac 与 Win 平台的强大 3D 室内装潢设计软件
  • Protect OpenAI key using Firebase function
  • 单片机的主流编程语言是什么
  • 实现简易 React SSR 框架
  • 最高加速超4倍!不依赖特定模型的统一模型压缩框架CPD发布(卡尔斯鲁厄理工学院)
  • 设计模式反模式:UML图示常见误用案例分析|设计模式|反模式|UML
  • 日本脸书Facebook代运营:如何投放广告与代运营合作全解析
  • NLP -->定义、应用、与职业前景解析
  • 开放式耳机别人能听到吗?不堵耳、不入耳的设计才舒服
  • 快速搭建和运行Spring Boot项目的简易指南
  • 数学建模学习(117):四阶龙格-库塔方法从理论到Python/matlab实践
  • 多线程篇(基本认识 - 线程相关API)(持续更新迭代)
  • 在WSL2中删除文件后,磁盘空间未释放怎么办
  • layui2.9 树组件默认无法修改节点图标,修改过程记录下
  • CentOS 7 更换为国内YUM源详细教程