java.——最大子序列和(前提是:全部都是非负数)
直接上代码吧:
情况一:全部是非负数整数的时候,其实非负实数处理也一样。
package Person;
import java.util.Scanner;
public class Main
{
public static final int maxn = 105;
public static int[] Arr = new int[maxn];
public static void main(String[] args)
{
int N;
Scanner cin = new Scanner(System.in);
N = cin.nextInt();
for(int i = 0 ; i < N ; i++)
{
Arr[i] = cin.nextInt();
}
int thissum,maxsum;
thissum = maxsum = 0;
for(int i = 0 ; i < N ; i++)
{
thissum += Arr[i];//向右累加
if(thissum > maxsum)
{
maxsum = thissum;//更新最大值
}
else if(thissum < 0)
{
thissum = 0;//若是小于零,则不可能是后面的部分和增大,抛弃它。
}
}
System.out.println(maxsum);
}
}
情况二:不确定里边的数是啥类型的。
从以下方面入手:
1.遍历一遍数组,如果全部是负数的时候,找出最大的负数,并把它输出来,结束程序,否则,进到下面的步骤。
2.思路和上面的一样。
代码实现如下:(假设所有的数均为整数)
package Person;
import java.util.Scanner;
public class Main
{
public static final int maxn = 105;
public static int[] Arr = new int[maxn];
public static void main(String[] args)
{
int N;
Scanner cin = new Scanner(System.in);
N = cin.nextInt();
int Max = 0;
for(int i = 0 ; i < N ; i++)
{
Arr[i] = cin.nextInt();
if(i == 0)
{
Max = Arr[i];
}
else
{
Max = Math.max(Max,Arr[i]);
}
}
if(Max < 0)
{
System.out.println(Max);
return;
}
//这个是分水岭。
int thissum,maxsum;
thissum = maxsum = 0;
for(int i = 0 ; i < N ; i++)
{
thissum += Arr[i];//向右累加
if(thissum > maxsum)
{
maxsum = thissum;//更新最大值
}
else if(thissum < 0)
{
thissum = 0;//若是小于零,则不可能是后面的部分和增大,抛弃它。
}
}
System.out.println(maxsum);
}
}
代码其实很简单的,如果有不明白的,随时可以留言,24小时在线,谢谢呀