【leetcode】300(Medium)Longest Increasing Subsequence

博客介绍了解决升序子序列问题的思路,给出参考链接。展示了迭代累计和动态规划两种提交代码及运行结果。其中动态规划方法维护一个dp[]数组,用于记录到当前元素为止最长升序子序列的长度。
思路

参考如下:https://segmentfault.com/a/1190000003819886

提交代码:迭代累计
class Solution{
	public int lengthOfLIS(int[] nums) {
		int[] ends=new int[nums.length];
		
		int i,j,mid,size=0;
		for(Integer num : nums) {
			i=0;j=size;
			while(i<j) {
				mid=(i+j)/2;
				if(num>ends[mid])
					i=mid+1;
				else 
					j=mid;
			}
			ends[i]=num;
			if(i==size)	size++;
		}
		return size;
	}
}
运行结果

在这里插入图片描述

提交代码:动态规划

维护一个dp[]数组,数组元素表示到当前元素为止,最长的升序子序列是多长。

class Solution{
	public int lengthOfLIS(int[] nums) {
		if(nums==null||nums.length==0)	return 0;
		int size=0,len=nums.length;
		int[] dp=new int[len];
		dp[0]=1;
		for(int i=0;i<len;i++) {
			for(int j=0;j<i;j++) {
				if(nums[j]>=nums[i]) {
					dp[i]=dp[i]==0?dp[j]:dp[i];
				}
				else if(dp[i]<dp[j]+1)
					dp[i]=dp[j]+1;
			}
			size=Math.max(size, dp[i]);
		}
		return size;
	}
}
运行结果:

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值