zoukankan      html  css  js  c++  java
  • 二维数组--求最大组数组和

    题目:

    程序要使用的数组放在一个叫 input.txt 的文件中,文件格式是:

    数组的行数,

    数组的列数,

    每一行的元素, (用逗号分开)

    每一个数字都是有符号32位整数,当然,行数和列数都是正整数。

    设计思想:

     自己的设计思路是,相邻两行进行加和,给出一个新的数组存储行加和值;然后相邻两列加和,新数组存储列加和值;找出行加和以及列加和最大值,确定中心范围区域,输出行、列第一个值(及中心范围中左上角的值)的数组下标,然后扩大区域,找出最大子数组和的最大值。

    但是,自己的设计思路,并没有实现,后询问同学,网上查找,找了一种新的设计思路,利用两层循环,实现题目。

    源代码:

    package test02;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    public class ErWei {
        public static void main(String[] args) throws IOException {
            
            //构造二维数组
            Integer c[][]= {
                {5,-7,8,6},
                {36,-9,-8,25},
                {-7,8,6,5}
            };
            //求和
            List<List<Integer>> main=new ArrayList<List<Integer>>();
            for(int i=0;i<c.length;i++)
            {
                List<Integer> heng=new ArrayList<Integer>();
                for(int j=0;j<c[0].length;j++)
                {
                    if(j!=0)
                        heng.add(c[i][j]+heng.get(j-1));
                    else heng.add(c[i][j]);
                }
                if(i!=0)
                    main.add(addList(heng,main.get(i-1)));
                else main.add(heng);
            }
            //求最大值
            
            int max=main.get(0).get(0);
            for(int z=0;z<main.size();z++)
            {
                int temp=Collections.max(main.get(z));
                if(max<temp)
                {
                    max=temp;
                }
            }
            //确定一位置
            for(int i1=0;i1<main.size();i1++)
            {
                for(int j1=0;j1<main.get(0).size();j1++)
                {
                    //确定二位置
                    for(int i2=i1+1;i2<main.size();i2++)
                    {
                        for(int j2=j1+1;j2<main.get(0).size();j2++)
                        {
                            int g_max=0;
                            if(i1!=0&&j1!=0)
                            {
                                g_max=(main.get(i2).get(j2)+main.get(i1-1).get(j1-1)-main.get(i2).get(j1-1)-main.get(i1-1).get(j2));
                                
                            }
                            else if(i1!=0)
                            {
                                g_max=(main.get(i2).get(j2)-main.get(i1-1).get(j2));
                            }
                            else if(j1!=0)
                            {
                                g_max=(main.get(i2).get(j2)-main.get(i2).get(j1-1));
                            }
                            if(max<g_max)
                            {
                                max=g_max;
                            }
                        }
                    }
                }
            }
            System.out.println("该二维数组最大子数组和为:"+max);
        }
        public static List<Integer> addList(List<Integer> a,List<Integer> b)
        {
            List<Integer> sum=new ArrayList<Integer>();
            for(int i=0;i<a.size();i++)
            {
                sum.add(a.get(i)+b.get(i));
            }
            return sum;
        }
    
    }

    运行截图:


  • 相关阅读:
    c# 24种设计模式
    .net如何处理高并发socket,建立高性能健壮的socket服务
    对于devexpress gridview 内插图加加进度条等的一点解读
    devexpress 如何读demo源码 总结
    DevExpress之TreeList节点绑定图片
    DevExpress LookUpEdit 下拉框基本操作
    dev NavBarControl控件
    DevExpress如何实现皮肤的添加及本地化
    vs2015未能计算子级
    c#networkcomms protobuf-net 文件加载出现问题
  • 原文地址:https://www.cnblogs.com/Qi77/p/11062344.html
Copyright © 2011-2022 走看看