蓝桥杯——连续子序列的个数

蓝桥杯——连续子序列的个数_第1张图片

一、 6 1 2 7  样例给的 那么当 按照顺序进行遍历 直到 i = 3 (最后一次循环)才满足要求 ,那么进入while(sum>=m) 循环  count = count + 4 -3 = 1  (这里由于是最后一个元素,后面不会再由元素,所以是1,下边我会细说) sum = sum - res[j] 就是从前面再减去 看看是否符合要求 即 1 2 7 符合的话再进行下一轮循环,这里sum 为 10 ,可以再进行下一轮循环。下一轮同上,count 再加1,sum = sum - res[j]  看看 2 7 是否符合,不符合结束循环,得出count 为 2。

二、升级一些 如果这里 是 6 1 2 7 8 9  这样 n 就变成了6 而m 还是 10,那么前面i=0 到 i =2 还是一样没有一个符合循环, 到了i =3 还是进入while 循环 count = count + 6 -3 = 3  变成3的原因是除了

6 1 2 7 符合要求  6 1 2 7 8    和  6 1 2 7 8 9 也符合要求   到了  继续while count  还是 加 3

这里是因为  1 2 7      1 2 7 8         1 2 7 8 9符合    2 7 不符合 跳出while 循环 最后 count 变成 了6   sum 变成 9 

i =4  时   这里注意!!!!!!    sum 是 9 (1     7)  而加上res[4] (8)  为  17 进入while 循环

count = 6 + 6 - 4 = 8   代表 2 7 8       2 7 8 9     一轮  while 完毕  ,下一轮 count 再加 2 ,count =10 代表  7 8   7 8 9     接下来 sum 变成 8   while结束

i =5  时    sum是17(8  9) 进入循环   count =  9 代表  8  9     sum =  9  跳出循环  count 加一

最后得出count 为 11 

 

三、 总结   当for  遍历到  i   count 进行统计    统计的个数与i后边还有几个元素有关系 而res又要减去res[j]  ,代表 从 res[0] 开始去掉元素 这里由于不能重复,所以j 是不可逆的假设这次的i 进入while 而 res[0]  res[1]之前已经算过,那么这次只能从res[2] 到  res[i]   从 res[2]  到res[i+1]从 res[2]  到res[i+2]......一直到序列末尾算,也就是第一次进行count = count  + n -i ,接下来再进行res[3] 到  res[i]   从 res[3]  到res[i+1]从 res[3]  到res[i+2]......一直到序列末尾算,如果res[3] 到r[i]小于 m 了 那么 就要跳出 while ,哪怕 从 res[3]  到res[i+1] 大于  m 也是,因为这是下一轮循环的事情了

语文不太好,有没看懂的可以在评论区交流,本人菜鸟,希望大佬多多指点

 Scanner scan = new Scanner (System.in);
		 long n,m;
		 n = scan.nextLong();
		 m = scan.nextLong(); 
		 long count =  0;
		 long res[] = new long [1000005];
		 for(int i = 0;i < n;i++)
			 res[i] = scan.nextLong();
		long sum = 0;
		int  j = 0;
		 for(int i = 0;i=m) { // 大于对比值进行循环
				 count = count + n - i;//
				 sum = sum - res[j];//从 res[0] 开始减
				 j++;
			 }
		 }

你可能感兴趣的:(java,算法,数据结构)