求最大连续子序列——京东面试题

题目要求:

数组{-2,3,-1,1,-9,3,10,2,-6,7,8},求其长度最大子序列。

求解代码:

                int a[]= {-2,3,-1,1,-9,3,10,2,-6,7,8};
		int box1=0,box2=0,max=a[0];//box1是选择放入,box2选择不放入
		int start=0;/start=0表示开始新的子序列
		for(int i=0;i<a.length;i++) {
			if(start==0) {
				box1=box2=a[i];
				start=1;
			}else {
				box2=box1;
				box1=box1+a[i];
			}
			if(box2>max) {
				max=box2;
			}
			if(box1<0) {
				start=0;
			}
			if(i==a.length-1&&box1>max) {
				max=box1;
			}
		}
		System.out.println(max);

 思路详解:

我们的解决步骤:

max初始值为a数组的第一个元素,防止数组全为负数时,max无法被赋值。(若为0,无法寻找到数组元素全为负数的最大连续子序列)

1.判断是否是新开始寻找子序列

  • 是:使box1和box2的值等于此时循环到的a数组元素。
  • 不是:开始判断是否放入数。

2.    每遇到一个数,分为放入和不放入的情况。

  • 放入:与前一个box1的值相加,放入box1盒子。
  • 不放入:此时步放入数字,使box2的值等于前一个box1的值。因为不放入数字,相当于当前子序列结束,所以此时与max值判断,当box2>max,更新max值为box2。

3.   比较此时box1的值与0,如果box1的值小于0,则当前子序列强制结束,下次循坏寻找新的子序列。因为此时的值已经为-2了,没有-2肯定能得到更大的连续子序列。

4.当循环结束,因为最后一次的box1的值未来得及赋值给box2,所以将box1与max比较,若box1>max,更新max。

猜你喜欢

转载自blog.csdn.net/qq_36470686/article/details/82890988