Leetcode---Longest Increasing Subsequence--动态规划

Longest Increasing Subsequence

题目链接:Longest Increasing Subsequence

思路:
  • 最近刷题速度异常的慢,有点崩溃。。。
  • 这道题目的难点在于,它的最长上升子序列不要求是连续的。
  • 开始看到该题毫无头绪,错误思路有:将数组两边降序的部分进行切除,最后剩余的序列还是包含同样的问题,不连续的序列无法处理。
  • 使用动态规划,正确思路是:定义一个dp[]数组,长度为nums.length,数组的每个元素存储从下标0到当前下标的最长上升子序列长度(该序列一定是包括当前元素在内的),dp[i+1] = max{该元素前面的所有元素中对应的dp[]值}+1,求法是遍历前面的所有元素寻找最大maxDP。
  • 上面这句话,(该序列一定是包括当前元素在内的),如若不然,求得的dp[]对应的数据是错误的,因为实际上前面没有那么多的元素真正小于该元素,我们要找的是实际小于我且呈递增现象的最大长度。
	public static int lengthOfLIS(int[] nums) {
		
		if(nums==null||nums.length==0) {
			return 0;
      	}else if(nums.length==1) {
    		return 1;
    	}
		int[] dp = new int[nums.length];
		dp[0] = 1;
		int i=1,j=0,max = dp[0];
		for(;i<nums.length;i++) {
			int maxDP = 0;
			for(j=0;j<=i;j++) {
				if(nums[j]<nums[i]) {
					//寻找小于当前元素且最大的dp
					maxDP = Math.max(maxDP, dp[j]);
				}
			}
			//最大的dp+1为当前dp
			dp[i] = maxDP+1;
			//max记录最终dp数组中的最大值返回
			if(dp[i]>max) {
				max = dp[i];
			}
		}
		return max;
    }

猜你喜欢

转载自blog.csdn.net/tiaochewang219/article/details/85321967