二维数组求和 团队开发
生活随笔
收集整理的這篇文章主要介紹了
二维数组求和 团队开发
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:返回一個二維整數數組中最大聯通子數組的和。
要求: 輸入一個二維整形數組,數組里有正數也有負數。 求所有子數組的和的最大值。要求時間復雜度為O(n)。
開發方式:團隊開發
主要思路:二維連通數組求最大子數組,我們在這里主要運用了降維的思想,主要是通過將二維數組轉化為一維數組求最大子數組的思想,在項目中定義一個算法,用于實現一行連續數組的最大子數組,并用p q記錄最大子數組的起始結束位置下標。在主函數中利用for循環實現二維數組每一行最大子數組的求和,在利用循環實現最大子數組的連接,添加對單獨正數據的判斷,從而實現連通的最大子數組問題。
代碼如下
import java.util.Scanner;public class Test {static int q=0,p=0;static Scanner str=new Scanner(System.in);public static void main(String args[]){int m1=0,m2=0; int max=0;int sum=0;System.out.println("輸入二維數組的行列數");m1=str.nextInt();m2=str.nextInt();int [][]a=new int[m1][m2];int []b=new int[m2];int []left=new int[m2];int []right=new int[m2];int []t=new int[m2];for (int i = 0; i < m1; i++){for (int j = 0; j < m2; j++){a[i][j]=str.nextInt(); }}for (int i = 0; i<m1; i++)//求每一行最大子數組{for (int j = 0; j<m2; j++) { b[j] = a[i][j]; } sum = findmax(m1, b, p, q); left[i] = p; //記錄最大子數組的坐標位置right[i] = q; t[i] = sum;}max = t[0];for (int i = 0; i + 1<m2; i++)//將最大子數組合并{if (left[i] <= right[i + 1] && right[i] >= left[i + 1])//兩行的最大子數組塊相連{max += t[i + 1];}for (int j = left[i]; j<left[i + 1]; j++){if (a[i + 1][j]>0)max += a[i + 1][j]; //判別獨立正數}}System.out.println("最大子數組和為:"+max); } public static int findmax(int n,int a[],int p, int q ){int []b=new int[a.length+1]; b[a.length]=0;int sum1=0;int max1=0;for(int i=0;i<n;i++){if(sum1<0){sum1=a[i];}else{sum1=sum1+a[i];}b[i] = sum1;}max1=b[0];for(int i=0;i<n;i++){if(max1<b[i]){max1=b[i];q=i;}}for(int i=q;i>=0;i--){if(b[i]==a[i]){p=i;break;}}return max1;} }?
轉載于:https://www.cnblogs.com/yuezhihao/p/6679699.html
總結
以上是生活随笔為你收集整理的二维数组求和 团队开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用BUCK进行iOS项目打包
- 下一篇: SVN使用过程中遇到的一些问题