二维数组的最大子数组和 时间复杂度: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 ...
随机推荐
- LeetCode第十五题-找出数组中三数和为0的答案
3Sum 问题简介: 给定n个整数的数组nums,是否有元素a,b,c在nums中,使a + b + c = 0? 找到数组中所有唯一的三元组,它们的总和为零 注:解决方案集不得包含重复的三元组 例如 ...
- 区别 chown和chmod的用法
本人总是习惯使用chmod,而把chown混淆. chown就是修改 第一列内容的 ,chmod是修改 第3,4列内容的. chown用法用来更改某个目录或文件的用户名和用户组的chown 用户名:组 ...
- 24 Game
You have 4 cards each containing a number from 1 to 9. You need to judge whether they could operated ...
- linux删除软链接文件【原创】
删除软链接文件时,不要加“/”,去注意 正确方法: rm -rf ./softlinkfile 错误方法: rm -rf ./softlinkfile/ 上面错误的操作,这样会把软链接的源文件一同删除 ...
- 07binlog日志介绍
设置日志格式为row 创建数据库和表 mysql> create database chinasoft charset=utf8mb4; mysql> use chinasoft; mys ...
- 4327: JSOI2012 玄武密码
4327: JSOI2012 玄武密码 Description 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老 ...
- 浅谈rest風格的接口开发
简单描述:因为前后端分离,开发完模块之后,接到team leader的指令,我这个渣渣javaer需要给前端人员返回一个接口,具体内容是课程列表json和分类列表json.emmmm,第一次写接口,心 ...
- vue.js遍历ajax请求的数据
<div id="dv" style="text-align: center;"><div class="head input-gr ...
- centos7手把手教你搭建zabbix监控
Centos7安装部署zabbix3.4 centos系统版本: 1.安装前需要先关闭selinux和firewall. 1.1 [root@zabbix ~]# vi /etc/selinux/co ...
- 2018年最新JAVA面试题总结之框架(4)
转自于:https://zhuanlan.zhihu.com/p/40098726 1.谈谈对spring框架的了解 ,spring有什么作用(IOC,AOP),spring的核心是什么?回答:Spr ...