数组的子数组和最大值

题目:

输入一个一维整形数组,数组里有正数也有负数。 一维数组首尾相接,象个一条首尾相接带子一样。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。

程序设计思想:求循环数组的子数组和的最大值,求子数组循环到数组第一个元素,另外定义一个素组长度为原来数组的两倍,定义和m为0,依次加上数组元素,定义最大值max,判断max与m大小,m比max大的话,m的值赋给max。循环先从下标0开始,循环一个数组长度后,再从下标1开始,循环终止于开始位置的前一个元素,循环开始的位置依次增加,知道数组的最后一个位置截止。

出现的问题:一次循环截止的条件刚开始写的j=k 发现出现数组下标越界的情况,改成j=k-1发现多加了元素,最后想到改为 j=k-1+s。

源代码

package ER;

import java.util.Scanner;

public class Text {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//数组长度
		int k;
		System.out.println("请输入数组长度");
		Scanner in=new Scanner(System.in);
		k=in.nextInt();
		int a[]=new int[k];
		//输入数组的元素
		System.out.println("输入数组的元素");
		for(int i=0;i<k;i++){
			int n;
			n=in.nextInt();
			a[i]=n;
		}
		int m = 0;
		int max = 0;
		int g=0;
		int l;
		l=2*k;
		//循环定义b数组长度为a的两倍
		int b[]=new int[l];
		for(int e=0;e<l;e++){
			if(e!=k){
				b[e]=a[e];
			}
			if(e==k){
				for(int r=0;r<k;r++){
					b[r+k]=a[r];
					e++;
				}
			}
		}
		//计算子数组和的最大值
		int s=0;
		int j;
		for(j=0;j<k+s;j++){
			m+=b[j];
			if(m>max){
				max=m;
			}
			if(j==k-1+s){
				s++;
				if(s<k){
					j=s-1;
					m=0;
				}
				else
					break;
			}
			
		}
		System.out.println("数组的最大子数组的和为:"+max);
		
		
	}

}

  

 

posted @ 2017-03-31 18:58  散人aaa  阅读(1043)  评论(0编辑  收藏  举报