二维数组最大子数组问题

设计思路:随机取数,然后以一个定点开始遍历求出它的所有的子数组,比较大小,如果比首先定义的max大 ,则替换,如果小,则继续比较。

代码:

package 二维数组最大子数组和;

import java.util.Random;
import java.util.Scanner;

public class Two {

public static void main(String[] args) {
		// TODO 自动生成的方法存根
		System.out.print("请输入数组的长度:");
		Scanner sr=new Scanner(System.in);
		int num=sr.nextInt();
		int [][]arry=new int[num][num];    //创建数组 
		Random a =new Random(num);                //随机取数
		for(int i=0;i<num;i++)                    
		{
		for(int j=0;j<num;j++)
		{
			arry[i][j]=a.nextInt(200)-100;
			System.out.print(arry[i][j]+"  ");
		}
			System.out.println();
		}
		System.out.println();
        int sum=0,max=arry[0][0],arryL=0,arryR=0,posL=0,posR=0;
		for(int i=0;i<num;i++)
		{
			for(int j=0;j<num;j++)
			{
				for(int i1=i;i1<num;i1++)
				{
					for(int j1=j;j1<num;j1++)
					{
						for(int i2=i;i2<=i1;i2++)
						{
							for(int j2=j;j2<=j1;j2++)
							{
								sum=sum+arry[i2][j2];
							}
						  }
							if(sum>=max)
							{
								 max = sum;
		                          arryL = i;
		                          arryR = j;
		                          posL = i1;
		                          posR = j1;
							}
							sum=0;
						
					}
				}
					
			}
			
		}
		
		System.out.println("最大子数组和为:");
        System.out.println(max);
        System.out.println("最大子数组为:");
        for(int i = arryL;i <= posL;i++)
            for(int j = arryR;j <= posR;j++)
            {
                System.out.print(arry[i][j] + "\t");
                if(j == posR)
                {
                    System.out.print("\n");
                }
            }
        
  
}
     
}

实验截图:

反思:刚开始编这个程序的时候没有思路,想用以前那个一维数组的算法,可是感觉没有那么简单,没有成功,所以用了一个最笨的办法,以一个点开始遍历。虽然这个方法易懂,好求最大子数组的位置,但时间复杂度比较高,为n的六次方。

     

        

posted @ 2015-05-04 10:42  twenty丶two  阅读(167)  评论(0编辑  收藏  举报