二维数组的最大子数组和 时间复杂度:O(n的四次方)
先上代码
小组成员:高达,李奔
package 三月二十一号; import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class Main1 { public static void main(String[] args) {
// TODO 自动生成的方法存根 //读取
int max=0;
int sum=0;
String b="E:\\大二\\软件工程\\java\\src\\三月二十一号\\input.txt";
ArrayList<String> list1 = new ArrayList<String>();
list1=wenjian(b);
//转化为数字数组
ArrayList<Integer> list = new ArrayList<Integer>();
list=String_To_Integer(list1);
//获取行数与列数
final int LINENUMBER=list.get(0);
final int COLUMN_NUMBER=list.get(1);
// System.out.println(LINENUMBER);
// System.out.println(COLUMN_NUMBER);
int a[]=new int[COLUMN_NUMBER];
//几行求解
for(int i1=1;i1<=LINENUMBER;i1++)
{
//N1-i1+1次
for(int i2=1;i2<=LINENUMBER-i1+1;i2++)
{ //给数组赋值
for(int j=0;j<COLUMN_NUMBER;j++)
{
for(int i3=0;i3<i1;i3++)
{
a[j]=a[j]+list.get((i2-1)*COLUMN_NUMBER+j+2+i3*COLUMN_NUMBER);
//System.out.println(a[j]);
}
}
//求这行的最大值
sum=max_int_Array(a);
//System.out.println(sum);
//比较
if(max<sum)
{
max=sum; }
//重置数组a
for(int i=0;i<a.length;i++)
{
a[i]=0;
}
}
} System.out.println(max);
}
//求一行
static Integer max_int_Array(int a[])
{
Integer sum=0;
Integer max=0;
for(int i=0;i<a.length;i++)
{
sum=sum+a[i];
if(sum<0)
{
sum=0;
}
if(sum>max)
{
max=sum;
}
}
if(sum==0)
{
max=a[0];
for(int i=1;i<a.length;i++)
{
if(max<a[i])
{
max=a[i];
}
}
}
return max; }
/*之前的代码但是还是觉得int[]好用
//求一行
static Integer max_int_Array(ArrayList<Integer> b)
{
Integer sum=0;
Integer max=0;
for(int i=0;i<b.size();i++)
{
sum=sum+b.get(i);
if(sum<0)
{
sum=0;
}
if(sum>max)
{
max=sum;
}
}
if(sum==0)
{
max=b.get(0);
for(int i=1;i<b.size();i++)
{
if(max<b.get(i))
{
max=b.get(i);
}
}
}
return max; }
*/
//转化成整数数组
public static ArrayList<Integer> String_To_Integer(ArrayList<String> list)
{
ArrayList<Integer> list1 = new ArrayList<Integer>();
for(int i=0;i<list.size();i++)
{
Integer integer =new Integer(list.get(i));
list1.add(integer);
}
return list1; }
//读取
public static ArrayList<String> wenjian(String b)
{
ArrayList<String> list = new ArrayList<String>();
boolean flag=true;
try // 建立一个对象,它把文件内容转成计算机能读懂的语言
{
Scanner shuru = new Scanner(new BufferedReader(new FileReader(b)));
String a;
//网友推荐更加简洁的写法
while ((shuru.hasNext()) ) {
// 一次读入一行数据
a=shuru.next();
if(isNumeric(a))
{
list.add(a);
}
else
{
flag=false;
} }
shuru.close();
} catch (IOException e) { e.printStackTrace();
}
if(flag==true)
{
return list;
}
else
{
System.err.println("文件格式有错误,退出");
return null;
}
}
//判断是不是数字
public static boolean isNumeric(String str){
Pattern pattern = Pattern.compile("-[0-9]+(.[0-9]+)?|[0-9]+(.[0-9]+)?");
Matcher isNum = pattern.matcher(str);
if( !isNum.matches() ){
return false;
}
return true;
}
}
成功结果:
我和我小组成员的思路是:
我(高达)提出的:建一个类来封装一行的一维正块,然后根据一维正块上下求索正块矩形,比较出最大值。时间复杂度:O(n的三次方)
但是逻辑上很难实现,做不了。
上课的时候有人说就是一行比然后俩行比然后三行比依次类推求出最大,然后我们就是使用的这种方法。时间复杂度:O(n的四次方)
实验过程:
先使用ArrayList<String>存储取出来的数字,存储的时候用正则来判断是否为数字,然后转化为ArrayList<Integer>存储,List的第一个是行数,第二个是列数,然后逻辑上2号位是第一个数字。
这个问题的解决关键是
1.理清关系,上下差一个列数。
2.当一行比的时候比n次,俩行比n-1次……n行比1次。
实验时遇到的问题:
方法意见不统一,我和小组成员有分歧,我一直坚持我的那种思路,但是我们认为实现起来太难了。
代码实现时的逻辑出现了俩次错误,i1 i2 i3 j i3和j的关系 i2和i1的使用 为啥出错我们自己的逻辑错误。
实验用时:
三小时(讨论+写代码+改代码)
二维数组的最大子数组和 时间复杂度:O(n的四次方)的更多相关文章
- 蚂蚁的难题(二)首尾相连数组的最大子数组和(DP)
蚂蚁的难题(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 下雨了,下雨了,蚂蚁搬家了. 已知有n种食材需要搬走,这些食材从1到n依次排成了一个圈.小蚂蚁对每种食材 ...
- 软件工程结对开发——返回一个整数数组中最大子数组的和(JAVA)
题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整型数组,数组里有正数也有负数: 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和: 求所有子数组的和的最大值.要求时间复杂度为 ...
- 求一个数组的最大子数组(C/C++实现)
最大子数组:要求相连,加起来的和最大的子数组就是一个数组的最大子数组.编译环境:VS2012,顺便说句其实我是C#程序员,我只是喜欢学C++. 其实这是个半成品,还有些BUG在里面,不过总体的思路是这 ...
- 求解数组环中最大子数组和的问题(java)
//石家庄铁道大学 信1405-1 班 唐炳辉 在上一次作业中,对于普通数组的最大子数组的求解问题的基础上,将普通的数组变成一个首尾相接的环,求这个环的最大子数组.类似的,只要改变普通数组的数组位置, ...
- nyoj983 首尾相连数组的最大子数组和
首尾相连数组的最大子数组和 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首尾是 ...
- nyoj 983 ——首尾相连数组的最大子数组和——————【最大子串和变形】
首尾相连数组的最大子数组和 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首 ...
- NYOJ 745 首尾相连数组的最大子数组和
首尾相连数组的最大子数组和 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首 ...
- nyoj--983--首尾相连数组的最大子数组和(动态规划)
首尾相连数组的最大子数组和 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首尾是 ...
- 求二维数组的最大子数组———曹玉松&&蔡迎盈
继上节课老师让求了一维数组最大的子数组后,这节课堂上,老师加深了难度,给了一个二维数组,求最大子数组,开始觉得很容易,但是自己思考起来感觉这个算法很困难,既需要考虑数组直接的连续,又要求出最大的,老师 ...
- 结对开发五--对一千个数long型的一维数组求最大子数组的和
一.设计思想 我们根据第一个实验,再让他自动生成1000个随机long型数.大致思想和实验一一样,自己已埋入炸弹. 二.实验代码 package com.minirisoft; import java ...
随机推荐
- day 24-1 继承
继承 什么是继承: 继承是一种创建新类的方式,在 python 中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 父类必须在子类上面 一个类 可以被多个类继承 一个 ...
- Linux中查看端口占用情况
1.lsof -i:端口号 用于查看某一端口的占用情况,比如查看8000端口的使用情况: # lsof -i:8000 2.netstat -tunlp | grep 端口号,用于查看指定的端口号的进 ...
- 使用Jenkins部署asp.net core
首先盗图一张 1.在Github上创建一个测试仓库 2.创建基于Asp.net Core的MVC项目 运行解决方案,验证代码没有问题,然后将代码迁入Github 3.添加Docker支持 项目--&g ...
- 20175226 2018-2019-2 《Java程序设计》第五周学习总结
20175226 2018-2019-2 <Java程序设计>第五周学习总结 教材学习内容总结 接口 包含接口声明和接口体 接口声明interface 接口的名字 接口体中包含常量的声明( ...
- bat实现固定时间循环抓取设备log
背景:测试时需要实时抓取android设备log,但是一份log抓取过来非常庞大(有时超过500M+,编辑器都打不开,还得找工具进行分割,甚是蛋疼),查看也非常不方便. 解决:基于上述情况,与其之后进 ...
- python复习基本知识
print(x or y) """x or y ; x 为 true ,则返回x ,否则返回flase“”“” and 则相反 优先级比较:not > and &g ...
- vertx的HttpServer模块
Start HttpServer /** * 启动 HttpServer * multi instances 采用 synchronized防止线程安全问题 * addHandlers 方法是acto ...
- python3+Robot Framework+PyCharm自动化测试框架设计
关于自动化测试框架的设计,笔者在前面的随笔里面有介绍和总结,这里结合实际的项目例子做个demo,环境部署参考笔者的的随笔<python3+Robot Framework+PyCharm环境部署及 ...
- .net core 2.1 Ef 连接Mysql数据库 DB first
本文介绍.net core2.1版本下 Mysql数据库采用DB first方式使用Ef 点击查看更简单的方法 1. 新建基于.net core2.1的项目(略) 2. 从nuget中引用Micros ...
- scrapy+mongodb
我们都知道scrapy适合爬取大量的网站信息,爬取到的信息储存到数据库显然需要更高的效率,scrapy配合mongodb是非常合适的,这里记录一下如何在scrapy中配置mongodb. 文件结构 $ ...