IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> LeetCode 300:最长递增子序列 -> 正文阅读

[数据结构与算法]LeetCode 300:最长递增子序列

链接
在这里插入图片描述
注意: 这里的子序列可以不连续

思路:动态规划 (dp table)

模板:
在这里插入图片描述

动态规划的核?设计思想是数学归纳法;

如想证明?个数学结论,那么我们 先假设这个结论在 k < n 时成?,然后根据这个假设,想办法推导证明出 k = n 的时候此结论也成?。如 果能够证明出来,那么就说明这个结论对于 k 等于任何数都成?。

设计动态规划算法,不是需要?个 dp 数组吗?可以假设 dp[0…i-1] 都已经被算出来 了,然后问:怎么通过这些结果算出 dp[i]?

dp数组的定义:dp[i] 表示以 nums[i] 这个数结尾的最长递增?序列的长度;

base case:dp[i] 初始值为 1,因为以 nums[i] 结尾的最?递增?序列起 码要包含它??。

在这里插入图片描述
根据这个定义,最终数组的结果(?序列的最??度)应该是 dp 数组中的最?值:
用for遍历每个元素作为结尾对应的最大自增子序列的长度,选出最大;
在这里插入图片描述
注意:并不是 i 越大,其子序列长度就越大 !

假设已经知道了 dp[0…4] 的所有结果,如何通过这些已知结果推出 dp[5] ?
如:
在这里插入图片描述

nums[5] = 3,既然是找递增?序列,只要找到前面那些结尾比 3 小的子序列,然后把 3 接到这些子序列末尾,就可以形成?个新的递增子序列,?且这个新的子序列长度加?。

nums[5] 前?有哪些元素小于 nums[5]?用for 循环比较?波就能把这些元素找出来。
以这些元素为结尾的最?递增?序列的?度是多少?回顾?下我们对 dp 数组的定义,它记录的正是以每个元素为末尾的最?递增?序列的?度。

例中nums[0] 和 nums[4] 都是小于 nums[5] 的,然后对比 dp[0] 和 dp[4] 的值,我们 让 nums[5] 和更长的递增?序列结合,得出 dp[5] = 2+1=3 ;

在这里插入图片描述

总结:
1.明确 dp 数组的定义。这?步对于任何动态规划问题都很重要,如果不得当或者不够清晰,会阻碍之后的步骤。

2.根据 dp 数组的定义,运?数学归纳法的思想,假设 dp[0…i-1] 都已知,想办法求出 dp[i],?旦这 ?步完成,整个题目基本就解决了。

Java实现:

dp定义是 dp[i] 表示以 nums[i] 这个数结尾的最长递增子序列的长度;
状态就是dp数组的索引/值

class Solution {
    public int lengthOfLIS(int[] nums) {
         // 一个元素对应一个子序列长度,所以不需要再加 1
        int dp[]=new int[nums.length];
        Arrays.fill(dp,1); // 求最大,初始化为小
        for(int i=0;i<nums.length;i++){ //遍历共 nums.length种状态
            for(int j=0;j<i;j++){ // 遍历结尾元素之前的所有元素 即0~ k-1
            // 遍历所有 小于结尾元素的 j , 并选出所有j中子序列长度最长的,再加1就是结果!
                if(nums[i]>nums[j]){ // 当 k-1 < k,满足递增条件 ,遍历j更新dp[i]
                    dp[i]=Math.max(dp[i],dp[j]+1); // 求出 k 对应的值: 0~j(k-1)最大的+1即dp[i],更新dp[i]
                }
            }
        }
        
        int res=-1;
        for(int i=0;i<nums.length;i++){
            res=Math.max(res,dp[i]);
        }
        return res;
    }
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-07-20 19:09:52  更:2022-07-20 19:10:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 23:21:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码