最长单调递增子序列

找出由n个数字组成的序列的最长单调递增子序列。

	// 错误代码(试图找到以某个元素开头的最长递增子序列)
	public void maxLis(int[] nums) // 1 2 7 6 8 3 4
	{
		int n = nums.length;
		int c = 0;
		int len = 1; // 递增子序列长度
		int maxLen = 0x80000000; // 最长递增子序列长度
		
		for (int i=0; i<n; i++)
		{
			c = nums[i];
			for (int j=i+1; j<n; j++)
			{
				if (c < nums[j])
				{
					c = nums[j];
					len++;
				}
			}
			// 内层for结束后,就找到了以下标i开头的最长的子序列长度
			maxLen =  maxLen > len ? maxLen : len;
			len = 1;
		}
		
		System.out.println("maxLen: "+maxLen);
	}

修改之后:   

用数组b[0:n-1]记录以a[i],0<=i<=n,为结尾元素的最长递增子序列的长度。

	int lisDyna(int[] a)
	{
		int i, j;
		int n = a.length;
		int k = 0;
		int [] b = new int[a.length];
		b[0] = 1; // 表示以a[0]为结尾元素的最长递增子序列长度为1
		for (i=1; i<n; i++)
		{
			for (j=0, k=0; j<i; j++) // 1, 2, 7, 6, 9, 3, 4, 5
			{
				if (a[j] <= a[i] && k < b[j]) // 当前元素小于结尾元素,且以当前元素结尾的子序列长度更长
					k = b[j];
			}
			b[i] = k+1;
		}
		return maxL(n, b);
	}
	
	// 打擂台
	int maxL(int n, int[] b)
	{
		int tmp = 0;
		for (int i=0; i<n; i++)
			if (b[i] > tmp)
				tmp = b[i];
		return tmp;
	}
	

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值