数组中升序序列的个数问题

【座右铭】1. 想要成为行家,就必须尝试解决大量的问题;

                    2. 解决大量问题并不代表能解决所有问题,而是表示解决下一个问题的几率变大了


1. 对于一个数组{1,2,3}它的子数组有{1,2},{1,3},{2,3},{1,2,3},元素之间可以不是连续的,对于数组 {5,9,1,7,2,6,3,8,10,4},升序子序列有多少个?或者换一种表达为:数组int a[]={5,9,1,7,2,6,3,8,10,4}。求其所有递增子数组(元素相对位置不变)的个数,例如:{5,9},{5,7,8,10},{1,2,6,8}。【问题来源于v_JULY_v的博客:http://blog.csdn.net/v_july_v/article/details/6855788

在此仅考虑所有元素都不相同

第一部分:思路

用T[1...N]来表示数组,则Ti表示第i个元素;用Si表示以Ti为最后一个元素的升序序列的个数;则有如下推导式:

S1=0

Si=Si+Sj+1 if Ti>Tj 1<=j<i<=N

那么总共的升序序列个数就等于S1+S2+S3+...+SN

举例说明,考虑{1,2,3,4}这个数组

S2有1个升序序列:{1,2} <== S1 + 1

S3有3个升序序列:{1,3} <== S1 + 1; {2,3},{1,2,3} <== S2 +1

S4有7个升序序列:{1,4} <== S1 + 1; {2,4},{1,2,4} <== S2 + 1;{3,4},{1,3,4} {2,3,4},{1,2,3,4} <== S3 + 1

总共有11个

第二部分:Java代码,不考虑异常情况

//参数说明:source为数组,len为数组的长度
	public static int increase(int[] source, int len)
	{
		int[] counter = new int[len];
		counter[0] = 0;
		for(int i=1;i<len;i++)
		{
			for(int j=i-1;j>=0;j--)
			{	
				if(source[i]>source[j])
				{
					counter[i] += (counter[j] + 1);
				}
			}
		}
		int sum = 0;
		for(int k=0;k<len;k++)
		{
			sum += counter[k];
		}
		return sum;
	}

第三部分:测试用例

{1} : 0

{1,2,3,4}: 11

{1,4,3,2}: 3

{1,3,4,2,5}:14

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值