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

[leetcode]300_最长递增子序列

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

进阶:
你能将算法的时间复杂度降低到 O(n log(n)) 吗?

解题思路:【动态规划】

    dp[i]表示num[i]结尾的最长递增子序列长度
    dp[i] = max(dp[i], dp[j] + 1)
        当 nums[i]>nums[j] 时: nums[i] 可以接在 nums[j] 之后(此题要求严格递增),此情况下最长上升子序列长度为 dp[j]+1 ;
        当 nums[i]<=nums[j] 时: nums[i] 无法接在 nums[j] 之后,此情况上升子序列不成立,跳过。
    初始化dp[i] = 1
class Solution:
    def longest_substring_dp(self, nums):
        length = len(nums)
        dp = [1] * length
        for i in range(1, length):
            for j in range(i):
                if nums[i] > nums[j]:
                    dp[i] = max(dp[i], dp[j] + 1)
        return max(dp)
if __name__ == '__main__':
    num = eval(input())
    solution = Solution()
    print(solution.longest_substring_dp(num))

仅作为代码记录,方便自学自查自纠


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

相关文章:

  • 【QT】 控件 -- 显示类
  • 安宝特方案 | AR在供应链管理中的应用:提升效率与透明度
  • 案例研究丨浪潮云洲通过DataEase推进多维度数据可视化建设
  • RV1126画面质量四:GOP改善画质
  • 【C++】类与对象初级应用篇:打造自定义日期类与日期计算器(2w5k字长文附源码)
  • 笔试-二维数组
  • HTTP Status 404 - /brand-demo/selectAllServlet错误解决原因-Servlet/JavaWeb/IDEA
  • Spring异常处理-@ExceptionHandler-@ControllerAdvice-全局异常处理
  • ue4多个面重叠闪烁
  • ubuntu18.04 Anconda安装及使用
  • 【网络安全】-访问控制-burp(1~6)
  • 在idea使用nacos微服务
  • LeetCode[中等] 45. 跳跃游戏 II
  • 排序算法的理解
  • 【ChatGPT】Python 实现计算两线段的变换矩阵
  • 解决Windows远程桌面 “为安全考虑,已锁定该用户账户,原因是登录尝试或密码更改尝试过多,请稍后片刻再重试,或与系统管理员或技术支持联系“问题
  • 师生健康监测系统:SpringBoot技术实践
  • Master PDF Editor 下载及详细安装教程
  • Codeforces Round 976 (Div. 2 ABCDE题)视频讲解
  • Django一分钟:使用prefetch_related避免陷入大量的查询中导致严重的性能问题
  • WebGL深究:动画与交互 —— 赋予虚拟世界生命与灵魂
  • YOLOv11尝鲜测试五分钟极简配置
  • SpringBoot整合JPA详解
  • 工控系统组成与安全需求分析
  • leetcode每日一题day21(24.10.1)——最低票价
  • Street View Synthesis with Gaussian Splatting and Diffusion Prior 学习笔记