课堂练习-求二维子数组的和最大值以及文件的导入
题目:返回一个整数数组中最大子数组的和02。
程序要使用的数组放在一个叫 input.txt 的文件中, 文件格式是:
数组的行数,
数组的列数,
每一行的元素, (用逗号分开)
每一个数字都是有符号32位整数。 当然, 行数和列数都是正整数。例如下面的文件说明数组是有1行, 6列, 元素依次是: 5, 6, –3, 8, –9, 2
[String fileName = "C:\\Users\\54417\\Desktop\\input.txt";
File file = new File(fileName);
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
String line;
StringBuilder number = new StringBuilder("");
while ((line = br.readLine()) != null) {
// 一行一行地处理...
// System.out.println(line);
number.append(line);
}
String[] split = number.toString().split(",");
//for (String s : split) System.out.println(s);
ArrayList<Integer> arrayList=new ArrayList<>();
for(String s:split){
if(Integer.parseInt(s)>99999999){
System.out.println("文件输入数字太大");
}else {
arrayList.add(Integer.parseInt(s));
}
}
int n=arrayList.get(0);
int m=arrayList.get(1);
int [][] c=new int[arrayList.get(0)][arrayList.get(1)];
int cnt=2;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
c[i][j]=arrayList.get(cnt);
cnt++;
System.out.print(c[i][j]);
System.out.print(" ");
}
System.out.println();
}
System.out.println(maxSubArray2(c,n,m));](java)
首先读入文件,使用文件缓冲流,读入到一个字符串中,
然后使用stringbudder类中的append方法,拼接成一个新的字符串,
然后在使用string的spilt函数使用","分割成一个字符串数组,
然后使用Integer中的ParseInt函数转化成整数类型,
存到一个n行m列的数组里,然后传入我的求和方法,进行最大和的计算。
[
public static int maxSubArray2(int [][]nums,int n,int m){
int a=1,b=1,c=1,d=1;
int [][] sums=new int[n+1][m+1];
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
sums[i][j]=sums[i-1][j]+sums[i][j-1]-sums[i-1][j-1]+nums[i-1][j-1];
}
}
int max=sums[1][1];
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
for(int x=i;x<=n;x++){
for(int y=j;y<=m;y++){
if((sums[x][y] - sums[x - i][y] - sums[x][y - j] + sums[x - i][y - j])>max){
a=x-i;b=y-j;c=x;d=y;
}
max= Math.max(max, sums[x][y] - sums[x - i][y] - sums[x][y - j] + sums[x - i][y - j]);
}
}
}
}
System.out.print("左上:"+(a+1)+"行");
System.out.println(" "+(b+1)+"列");
System.out.print("右下:"+c+"行 ");
System.out.println(d+"列");
return max;
}](java)
在计算和的函数中,我定义了一个前缀和数组,来提前计算一些数组的和,
然后分别枚举i行j列的数组,使用x,y表示在原数组中的位置,使用前缀和数组来计算原数组中所有i行j列数组中的元素的和。
然后分别进行比较,交换,最后计算出最大值。