1.最长递增子序列

LeetCode 300:Longest Increasing Subsequence

1.题目描述:

        给定一个无序数组,找到最长的递增子序列(这个递增序列可以不连续),输出它的长度(可能存在很多个递增序列,这里只需要输出长度即可)例如:

        要求:时间复杂度为O(n^2)

        输入:[10,9,2,5,3,7,101,18]

        输出:4。。。最长递增子序列为[2,3,7,101]或者[2,3,7,18]

2.解题思路:

        这是一个典型的动态规划问题。我们创建一个长度为n的数组(n等于给定数组的长度)dp来保存到达每一个数字的最长子序列的长度,首先全部初始化为1,因为本身一个数字就是一个递增序列,长度为1。接下来我们使用第i个数字和它之前的每一数字j进行比较,如果nums[i] > nums[j],那么我们就把之前的最大值max进行比较,把最大的数字放进dp[i]中。然后同时把max和结果进行比较,获得全局最大值res,等到循环结束后,res就是要输出的结果。本解决方法时间复杂度O(n^2),空间复杂度是O(n).

Java 代码如下:

public class Main {
	 public static int lengthOfLIS(int[] nums) {
	        if(nums.length == 0)return 0;
	        int[] dp = new int[nums.length];
	        for(int index = 0;index < nums.length; index++){
	            dp[index] = 1;
	        }
	        int res = 1;
	        for(int i = 1;i < nums.length;i++){
	            int max = 1;
	            for(int j = 0;j < i;j++){
	                if(nums[i] > nums[j]){
	                    max = Math.max(max,dp[j]+1);	                    
	                }
	            }
	            dp[i] = max;
	            res = Math.max(res,max);
	        }
	        return res;
	    }
	 public static void main(String[] args) {
		 int[] nums = new int[]{10,9,2,5,3,7,101,18};
		 System.out.println(lengthOfLIS(nums));	
	}
}

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值