zoukankan      html  css  js  c++  java
  • 二维数组的最大子数组之和

    一、设计思路:与求一维数组的最大子数组类似,将二维数组转化为一维数组来计算,也是通过遍历的方式将一个子矩阵与上几个子矩阵相加如果小于0则舍去这个子矩阵,按此方法计算从这个子矩阵以后的矩阵,求得遍历中最大值,即为最大子数组之和。

    二、代码:

    package soft_third_test;
    
     
    
    public class test {
    
     
    
        static int maxSum(int p[][],int startLine,int endLine,int n){
    
            int ans=p[endLine][1]-p[startLine][1];
    
            int cmax=ans;
    
            for(int i=2;i<=n;i++){
    
                int ci=p[endLine][i]-p[startLine][i];
    
                cmax=Math.max(cmax+ci, ci);
    
                ans=Math.max(cmax, ans);
    
            }
    
            return ans;
    
        }
    
        static int[][] colSum(int arr[][]){
    
            int m=arr.length;
    
            int n=arr[0].length;
    
            int p[][]=new int[m+1][n+1];
    
            for(int i=1;i<=m;i++)
    
                for(int j=1;j<=n;j++)
    
                    p[i][j]=p[i-1][j]+arr[i-1][j-1];
    
            return p;
    
        }
    
        static int maxArrSum(int arr[][]){
    
            int m=arr.length;
    
            int n=arr[0].length;
    
            if(m>n){
    
                arr=reverseArr(arr);
    
                int tmp=m;
    
                m=n;
    
                n=tmp;
    
            }
    
            int p[][]=colSum(arr);
    
            int tempMax=0;
    
             
    
            //h表示当前矩阵的行数,即为把对多少行当做一行看待
    
            for(int h=1;h<=m;h++)
    
                for(int i=1;i+h-1<=m;i++){
    
                    int endLine=i+h-1;
    
                     
    
                    //转换为长度为n的一位数著,复杂度为O(n)
    
                    tempMax=Math.max(tempMax, maxSum(p,i,endLine,n));
    
                }
    
            return tempMax;
    
        }
    
        static int[][] reverseArr(int[][] arr) {
    
            // TODO Auto-generated method stub
    
            int m=arr.length;
    
            int n=arr[0].length;
    
            int newArr[][]=new int[n][m];
    
            for(int i=0;i<m;i++)
    
                for(int j=0;j<n;j++)
    
                    newArr[j][i]=arr[i][j];
    
            return newArr;
    
        }
    
        public static void main(String[] args) {
    
            // TODO Auto-generated method stub  
    
             
    
            int arr[][]={{1,2,-51,-4,-50},{-8,-3,4,255,1},{3,8,104,1,3},{-4,-1,10,7,-6}};
    
            int ans=maxArrSum(arr);
    System.out.println(ans); } }

    三、结果截图

    四、代码测试中的问题

      首先是由于对java语言不熟悉,与c语言混淆,如输入输出语句的语法问题。还有就是程序运行出错,经检查是循环语句中未能准确写出循环终止条件,导致程序无限循环,不能正常使用。

    五、总结

      这次的开发让我了解到的算法之间的共通性,可以举一反三,拓展思路。如由一维数组向二维数组拓展,但算法的思路仍然相同。还有就是要熟练的掌握java语言,避免出现语法上的错误。

    六、结组成员:杜永超、郭昊

  • 相关阅读:
    python 实现一个双色球生成程序
    python 列表排序方法sort、sorted技巧篇
    python 列表排序方法reverse、sort、sorted基础篇
    python random模块(获取随机数)的常用方法及示例
    python 开发在线音乐播放器-简易版
    用户画像从0到100的构建思路
    “营销数字化10讲”(3):营销数字化的灵魂是用户画像
    什么是用户画像(User Profile)
    精心整理了7种常用数据分析方法
    机器学习模型评估指标总结
  • 原文地址:https://www.cnblogs.com/act-gh95/p/4412388.html
Copyright © 2011-2022 走看看