300. 最长递增子序列 中等 两种解法 :动态规划dp 、贪心+二分
- 最长递增子序列
给你一个整数数组 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)) 吗?
class Solution {
public int lengthOfLIS(int[] nums) {
int n=nums.length;
int f[]=new int[n];
f[0]=1;
int ans=1;
for(int i=1;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);
}
}
}
for(int x:f)ans=Math.max(ans, x);
return ans;
}
}
贪心+二分
class Solution {
public int lengthOfLIS(int[] nums) {
int len=1,n=nums.length;
if(n==0)return 0;
int d[]=new int [n+1];
d[len]=nums[0];
for(int x:nums){
if(x>d[len])d[++len]=x;
else{
int l=1,r=len;
while(l<r){
int mid=l+r>>1;
if(d[mid]>x)r=mid;
else l=mid+1;
}
d[l]=x;
}
}
return len;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码