首页 > 其他分享 >【代码随想录Day41】动态规划Part10

【代码随想录Day41】动态规划Part10

时间:2024-10-13 15:19:06浏览次数:3  
标签:int Part10 随想录 Day41 数组 序列 长度 dp result

300.最长递增子序列

题目链接/文章讲解:代码随想录
视频讲解:动态规划之子序列问题,元素不连续!| LeetCode:300.最长递增子序列_哔哩哔哩_bilibili

public int lengthOfLIS(int[] nums) {
    // 获取数组的长度
    int n = nums.length;

    // 创建一个用于存储以每个元素结尾的最长递增子序列的长度的数组
    int[] dp = new int[n + 1];

    // 初始化dp数组,默认每个位置的最长递增子序列长度为1
    for (int j = 0; j <= n; j++) {
        dp[j] = 1;
    }

    // 初始化结果变量,记录最长递增子序列的最大长度
    int result = 1;

    // 遍历每个元素
    for (int i = 1; i < nums.length; i++) {
        // 对于当前元素,遍历其之前的所有元素
        for (int j = 0; j < i; j++) {
            // 如果当前元素大于之前的元素,可能形成递增子序列
            if (nums[i] > nums[j]) {
                // 更新dp[i]为以nums[i]结尾的最长递增子序列长度
                dp[i] = Math.max(dp[i], dp[j] + 1);
            }
        }
        // 更新结果,保持最长递增子序列的最大长度
        result = Math.max(result, dp[i]);
    }

    // 返回最长递增子序列的长度
    return result;
}

674. 最长连续递增序列

题目链接/文章讲解:代码随想录
视频讲解:动态规划之子序列问题,重点在于连续!| LeetCode:674.最长连续递增序列_哔哩哔哩_bilibili

class Solution {
    public int findLengthOfLCIS(int[] nums) {
        // 获取输入数组的长度
        int n = nums.length;
        // 创建一个 dp 数组,用于存储以每个元素结尾的 LCIS(最长连续递增子序列)的长度
        int[] dp = new int[n];
        // 初始化第一个元素的 LCIS 长度为 1
        dp[0] = 1;
        // 用于记录当前找到的最长连续递增子序列的长度
        int result = 1;

        // 从第二个元素开始遍历数组
        for (int i = 1; i < n; i++) {
            // 如果当前元素大于前一个元素,说明可以延续递增序列
            if (nums[i] > nums[i - 1]) {
                // 更新 dp[i] 为前一个元素的 dp 值加 1
                dp[i] = Math.max(dp[i], dp[i - 1] + 1);
            } else {
                // 如果当前元素不大于前一个元素,重新开始新的 LCIS,长度为 1
                dp[i] = 1;
            }
            // 更新 result 为当前找到的最大值
            result = Math.max(result, dp[i]);
        }
        // 返回最长连续递增子序列的长度
        return result;
    }
}

718. 最长重复子数组

题目链接/文章讲解:代码随想录
视频讲解:动态规划之子序列问题,想清楚 DP 数组的定义 | LeetCode:718.最长重复子数组_哔哩哔哩_bilibili

class Solution {
    public int findLength(int[] nums1, int[] nums2) {
        // 获取两个数组的长度
        int m = nums1.length;
        int n = nums2.length;

        // 创建一个二维数组 dp,用于存储公共子数组的长度
        // dp[i][j] 表示 nums1 的前 i 个元素和 nums2 的前 j 个元素的公共子数组的长度
        int[][] dp = new int[m + 1][n + 1];

        // 用于记录找到的最大公共子数组的长度
        int result = 0;

        // 遍历 nums1 和 nums2 的每个元素
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                // 如果 nums1 的第 i-1 个元素等于 nums2 的第 j-1 个元素
                if (nums1[i - 1] == nums2[j - 1]) {
                    // 更新 dp[i][j],表示当前公共子数组长度
                    // dp[i][j] 由 dp[i-1][j-1] 加 1 得到
                    dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - 1] + 1);
                }
                // 更新 result,记录当前找到的最大公共子数组长度
                result = Math.max(result, dp[i][j]);
            }
        }
        // 返回找到的最大公共子数组长度
        return result;
    }
}

标签:int,Part10,随想录,Day41,数组,序列,长度,dp,result
From: https://blog.csdn.net/weixin_43724673/article/details/142899180

相关文章

  • day41
    接雨水classSolution{public:inttrap(vector&height){intret=0;stackst;st.push(0);for(inti=1;i<height.size();++i){if(height[i]<=height[st.top()]){st.push(i);}else{while(!st.empty()&&height[i]>height[st.to......
  • 代码随想录Day24 | LeetCode 122. 买卖股票的最佳时机 II、LeetCode 55. 跳跃游戏、Le
    LeetCode122.买卖股票的最佳时机IIclassSolution:defmaxProfit(self,prices:List[int])->int:res=0foriinrange(1,len(prices)):res+=max(0,prices[i]-prices[i-1])returnresLeetCode55.跳跃游戏class......
  • 代码随想录算法训练营 | 322. 零钱兑换,279.完全平方数,139.单词拆分
    322.零钱兑换题目链接:322.零钱兑换文档讲解︰代码随想录(programmercarl.com)视频讲解︰零钱兑换日期:2024-10-12想法:完全背包,注意初始化除dp[0]外都要置为Integer.MAX_VALUE,才能后面选出最小值,还有判断dp[j-coins[i]]!=Integer.MAX_VALUE,不成立的化代表除去coins[i]后,没有......
  • 代码随想录算法训练营第十天|Day10栈与队列
    232.用栈实现队列题目链接/文章讲解/视频讲解:https://programmercarl.com/0232.%E7%94%A8%E6%A0%88%E5%AE%9E%E7%8E%B0%E9%98%9F%E5%88%97.html思路这是一道模拟题,不涉及到具体算法,使用栈来模拟队列的行为,如果仅仅用一个栈,是一定不行的,所以需要两个栈一个输入栈,一个输出......
  • 代码随想录算法训练营第十二天|Day12二叉树
    递归遍历 题目链接/文章讲解/视频讲解:https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E9%80%92%E5%BD%92%E9%81%8D%E5%8E%86.html思路每次写递归,按照三要素来写,可以写出正确的递归算法!确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要......
  • 代码随想录算法训练营第十一天|Day11栈与队列
    150.逆波兰表达式求值题目链接/文章讲解/视频讲解:https://programmercarl.com/0150.%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC.html思路#defineMAX_TOKENS1000#defineMAX_TOKEN_LEN10typedefstruct{longlongdat......
  • 代码随想录算法训练营第十三天|Day13二叉树
    226.翻转二叉树题目链接/文章讲解/视频讲解:https://programmercarl.com/0226.%E7%BF%BB%E8%BD%AC%E4%BA%8C%E5%8F%89%E6%A0%91.html思路只要把每一个节点的左右孩子翻转一下,就可以达到整体翻转的效果递归法structTreeNode*invertTree(structTreeNode*root){if(!......
  • 代码随想录训练营第五天|Leetcode.349,Leetcode.454,Leetcode19,Leetcode18
    一、哈希表和set和map和数组的关系 用哈希表,判断是否出现过。数值很大或者数值很分散时,不用数组,占用空间大,用set。set,multiset数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判......
  • 代码随想录训练营第60天|冗余连接
    108.冗余连接#include<iostream>#include<vector>usingnamespacestd;intn;//节点数量vector<int>father(1001,0);//按照节点大小范围定义数组//并查集初始化voidinit(){for(inti=0;i<=n;++i){father[i]=i;}}//并查集......
  • 代码随想录算法训练营day12|144.二叉树的前序遍历 94.二叉树的中序遍历 145.二叉
    学习资料:https://programmercarl.com/二叉树理论基础.html二叉树:满二叉树、完全二叉树、二叉搜索数、平衡二叉搜索树;链式存储、顺序存储;前序/中序/后序遍历递归法、迭代法,层序深度优先搜索dfs,广度优先搜索学习记录:144.二叉树的前序遍历(也要注重二叉数的输入方式;递归法比迭......