lc300.最长递增子序列
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.最长递增子序列相关推荐
- 最长递增子序列的两种解法
以LeetCode-300为例: O(n^2)解法: dp数组表示以i结尾的最长递增子序列的长度 class Solution { public:int lengthOfLIS(vector<i ...
- 最长递增子序列问题的求解
一, 最长递增子序列问题的描述 设L=<a1,a2,-,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,-,akm>,其中k1<k2 ...
- 编程之美2.16 最长递增子序列
这道题目要求返回一个数字,这个数字代表一个数组中最长的递增子序列,当然,不要求这个序列是连续的,比如,有这样一个数组:{1, 3,5,7, 2, 9},那么这个数组的最长递增子序列就是5, ...
- 洛谷P2766-最长递增子序列问题
chunlvxiong的博客 题目描述: 给定正整数序列x1,...,xn (1≤n≤500). 1.计算其最长递增子序列的长度s. 2.计算从给定的序列中最多可取出多少个长度为s的递增子序列. 3. ...
- 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
最大子序列 最大子序列是要找出由数组成的一维数组中和最大的连续子序列.比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大:而 {5,-6,4,2}的最大子序列是{4, ...
- 拦截导弹(最长递增子序列)
题目描述:某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...
- Java输出数组中最长递增子序列的代码
下面内容是关于Java输出数组中最长递增子序列的内容,希望对大伙有较大用途. package com.wzs;import java.util.ArrayList; import java.util. ...
- 动态规划(最长递增子序列)---最长递增子序列
最长递增子序列 300. Longest Increasing Subsequence (Medium) 题目描述: 给定一个数组,找到它的最长递增子序列 思路分析: 动态规划思想,定义一个数 ...
- 112. Leetcode 673. 最长递增子序列的个数 (动态规划-子序列问题)
步骤一.确定状态: 确定dp数组及下标含义 dp[i]表示以nums[i]结尾的数组最长递增子序列的长度, count数组, count[i]记 录以nums[i]结尾的数组,最长递增子序列的个数. ...
最新文章
- Codeforces Round #596 Div. 2 C ~E
- java 十亿数据量运行速度慢_Java学习进阶之数据结构知识梳理
- [bzoj1303][CQOI2009]中位数图
- ADO得到字段名的代码
- 【转】Asp.Net MVC详解Controller之Filter
- 专访阿里云雁杨:因需求而进化,ECS云服务器追求弹性极致
- 大家有哪些被骗的很惨的经历?
- Linux内核中的PID散列表实例
- scratch炫酷格斗游戏
- 【centos8】问题解决:Failed to download metadata for repo ‘appstream‘: Cannot prepare internal mirrorlist:.
- 排序算法(分类,时间复杂度)(快速排序,插入排序,希尔排序,选择排序,冒泡排序)
- 最美的年纪、最美的夏天——毕业快乐
- 【2022小米秋招(2023校招)】软件开发方向 笔试题1——链表反转
- 医药行业大拼杀 小药药、药聚汇、朗致集团医药、同仁堂,模式对比
- 普通用户使用su无法切到root用户的解决方法
- RTSP,Java实现简单的RTSP报文交换
- 【机器学习】有监督、无监督、自监督、半监督、弱监督的区别
- ftp服务器软件下载,几种流行的ftp服务器软件下载
- 工程机械的深度学习和计算机视觉算法相关论文简介
- 面向新手的西门子博途软件常用功能介绍
热门文章
- 查看二进制文件,报错 You are not using binary logging
- MySQL分区间进行数据统计
- Opatch java 路径_Windows平台下opatch apply报错:OUI-67073
- lt;SCRIPT src=quot;../scripts/LoadWebOffice.jsquot;gt;lt;/SCRIPTgt;
- linux malloc free 内存碎片_内存申请malloc/new与内存释放free/delete的区别
- maven打的包带exec包比不带的大_spring boot maven打包可执行jar包缺少依赖包的问题...
- 如何从外网向内网传东西_鱼缸内出现气泡还会不断缓缓升起,是什么东西,如何处理和解决?...
- django 更改默认数据库为MySQL
- MySQL5.6多实例安装
- react-redux学习笔记