lc300.最长递增子序列

题目

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

提示:

1 <= nums.length <= 2500
-104 <= nums[i] <= 104

解法一:动态规划

最容易想到的就是用f[i]来表示前i个元素上升子序列的最大长度。

时间复杂度:O(n^2);

空间复杂度:O(n);

代码如下:

class Solution {public int lengthOfLIS(int[] nums) {int n = nums.length;int[] f = new int[n];int res = 1;for(int i = 0; i < n; i++) {f[i] = 1;for(int j = 0; j < i; j++) {if(nums[i] > nums[j]) {f[i] = Math.max(f[i], f[j] + 1);}}res = Math.max(res, f[i]);}return res;}
}

运行结果:

解法二:贪心+二分

观察子序列:

10 9 2 5 3 7 101 18

可以用一个数组f[i]来表示子序列长度为i的最小某位元素,比如f[1]表示长度为1的递增子序列的最小元素,遍历到nums[0]时,f[1] = 10,当遍历到nums[1]时,由于f[1] = 9,只需要保存所有长度为1的递增子序列的最后一个元素的最小值(这里10, 9可以看成两个递增子序列);同理,当遍历到nums[2]时,f[1] = 2,当nums[3]时,这是nums[3] > f[1],则一个长度为2的子序列长度可以放入f[2]中。对于nums[3] <= f[i]时,我们需要在f数组中找到第一个大于等于nums[i]的数,并进行替换。

时间复杂度:O(nlogn)

空间复杂度:O(n)

代码如下:

class Solution {public int lengthOfLIS(int[] nums) {int[] f = new int[nums.length + 1];int cnt = 0;f[0] = -0x3f3f3f3f;for(int i = 0; i < nums.length; i++) {if(nums[i] > f[cnt]) f[++cnt] = nums[i];else {int l = 1, r = cnt;while(l < r) {int mid = l + r >> 1;if(f[mid] >= nums[i]) r = mid;else l = mid + 1;}f[l] = nums[i];}}return cnt;}
}

提交结果:

lc300.最长递增子序列相关推荐

  1. 最长递增子序列的两种解法

    以LeetCode-300为例: O(n^2)解法: dp数组表示以i结尾的最长递增子序列的长度 class Solution { public:int lengthOfLIS(vector<i ...

  2. 最长递增子序列问题的求解

    一, 最长递增子序列问题的描述 设L=<a1,a2,-,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,-,akm>,其中k1<k2 ...

  3. 编程之美2.16 最长递增子序列

          这道题目要求返回一个数字,这个数字代表一个数组中最长的递增子序列,当然,不要求这个序列是连续的,比如,有这样一个数组:{1, 3,5,7, 2, 9},那么这个数组的最长递增子序列就是5, ...

  4. 洛谷P2766-最长递增子序列问题

    chunlvxiong的博客 题目描述: 给定正整数序列x1,...,xn (1≤n≤500). 1.计算其最长递增子序列的长度s. 2.计算从给定的序列中最多可取出多少个长度为s的递增子序列. 3. ...

  5. 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离

    最大子序列 最大子序列是要找出由数组成的一维数组中和最大的连续子序列.比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大:而 {5,-6,4,2}的最大子序列是{4, ...

  6. 拦截导弹(最长递增子序列)

    题目描述:某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...

  7. Java输出数组中最长递增子序列的代码

    下面内容是关于Java输出数组中最长递增子序列的内容,希望对大伙有较大用途. package com.wzs;import java.util.ArrayList; import java.util. ...

  8. 动态规划(最长递增子序列)---最长递增子序列

    最长递增子序列 300. Longest Increasing Subsequence (Medium) 题目描述:   给定一个数组,找到它的最长递增子序列 思路分析:   动态规划思想,定义一个数 ...

  9. 112. Leetcode 673. 最长递增子序列的个数 (动态规划-子序列问题)

    步骤一.确定状态: 确定dp数组及下标含义 dp[i]表示以nums[i]结尾的数组最长递增子序列的长度, count数组, count[i]记 录以nums[i]结尾的数组,最长递增子序列的个数. ...

最新文章

  1. Codeforces Round #596 Div. 2 C ~E
  2. java 十亿数据量运行速度慢_Java学习进阶之数据结构知识梳理
  3. [bzoj1303][CQOI2009]中位数图
  4. ADO得到字段名的代码
  5. 【转】Asp.Net MVC详解Controller之Filter
  6. 专访阿里云雁杨:因需求而进化,ECS云服务器追求弹性极致
  7. 大家有哪些被骗的很惨的经历?
  8. Linux内核中的PID散列表实例
  9. scratch炫酷格斗游戏
  10. 【centos8】问题解决:Failed to download metadata for repo ‘appstream‘: Cannot prepare internal mirrorlist:.
  11. 排序算法(分类,时间复杂度)(快速排序,插入排序,希尔排序,选择排序,冒泡排序)
  12. 最美的年纪、最美的夏天——毕业快乐
  13. 【2022小米秋招(2023校招)】软件开发方向 笔试题1——链表反转
  14. 医药行业大拼杀 小药药、药聚汇、朗致集团医药、同仁堂,模式对比
  15. 普通用户使用su无法切到root用户的解决方法
  16. RTSP,Java实现简单的RTSP报文交换
  17. 【机器学习】有监督、无监督、自监督、半监督、弱监督的区别
  18. ftp服务器软件下载,几种流行的ftp服务器软件下载
  19. 工程机械的深度学习和计算机视觉算法相关论文简介
  20. 面向新手的西门子博途软件常用功能介绍

热门文章

  1. 查看二进制文件,报错 You are not using binary logging
  2. MySQL分区间进行数据统计
  3. Opatch java 路径_Windows平台下opatch apply报错:OUI-67073
  4. lt;SCRIPT src=quot;../scripts/LoadWebOffice.jsquot;gt;lt;/SCRIPTgt;
  5. linux malloc free 内存碎片_内存申请malloc/new与内存释放free/delete的区别
  6. maven打的包带exec包比不带的大_spring boot maven打包可执行jar包缺少依赖包的问题...
  7. 如何从外网向内网传东西_鱼缸内出现气泡还会不断缓缓升起,是什么东西,如何处理和解决?...
  8. django 更改默认数据库为MySQL
  9. MySQL5.6多实例安装
  10. react-redux学习笔记