二维数组的最大值

一.题目:

返回一个二维整数数组中最大子数组的和。 要求: 输入一个二维整形数组,数组里有正数也有负数。 二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)。

二:结对编程要求:

两人结对完成编程任务。 一人主要负责程序分析,代码编程。 一人负责代码复审和代码测试计划。 发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)。

三.代码:

#include <iostream>
#include <cstring>
//#include<vector>
//#include<cstdio>
#define NDEBUG 
#include <assert.h>
//#define INF -9999
//#define N 100
//?宏定义与设置全局变量有什么区别
const int N = 500;
const int INF = -9999;
using namespace std;

int maxSubArray(int a[], int n)
{
assert(a!=NULL && n>0);
int cur = 0;
int max = INF;

for (int i=0; i<n; i++)
{
cur +=a[i];
if (cur < 0)
{
cur = 0;
}

if (cur > max)
{
max = cur;
}
}
return max;
}
int findMaxSubMatrix(int a[][N], int n) //?为什么这里是a[][N]
{
int tmpSum[N];
int max = INF;

//枚举所有行的可能组合
for (int i=0; i<n; i++)
{
//将tmpSum清零
memset(tmpSum, 0, sizeof(tmpSum));
for (int j=i; j<n; j++)

//加上当前行的元素
for(int k=0; k<n; k++)
{
tmpSum[k] += a[j][k];
}
int tmpMax = maxSubArray(tmpSum, n);
if(tmpMax >max)
{
max=tmpMax;
}
}
}
return max;
}

int main()
{
int a[N][N];
int n; //数组的大小
cout<<"请输入数组n*n中n的大小: "<<endl;
while (cin>>n && n)
{
for (int i=0; i<n; i++)
{
for (int j=0; j<n; j++)
{
int k=rand();
a[i][j]= k%2==0 ?rand()%100+1:(-rand()%100+1);
}
}
for (int i=0; i<n; i++)
{
for (int j=0; j<n; j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
cout<<"最大子数组的和为: "<<findMaxSubMatrix(a, n)<<endl;
}

return 0;
}

四.思想:

程序中涉及到的两个函数:

1.assert(a!=NULL && n>0);

assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:
#include <assert.h>
void assert( int expression );
assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。
已放弃使用assert()的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:
#include <stdio.h> 
#define NDEBUG 
#include <assert.h> 
2.
将tmpSum清零      memset(tmpSum, 0, sizeof(tmpSum));

需要的头文件
C中为<memory.h> 或 <string.h>
C++中为<cstring>
void * memset ( void * ptr, int value, size_t num ); 
为地址ptr开始的num个字节赋值value,注意:是逐个字节赋值,ptr开始的num个字节中的每个字节都赋值为value。
(1) 若ptr指向char型地址,value可为任意字符值;
(2) 若ptr指向非char型,如int型地址,要想赋值正确,value的值只能是-1或0,因为-1和0转化成二进制后每一位都是一样的,设int型占4个字节,则-1=0XFFFFFFFF, 0=0X00000000。
思路:

程序的时间复杂度为O(n^3)。findMaxSubMatrix()找出最大的子数组之和,i控制行,它是一行一行的往下找最大子数组,比如当i等于2时,在同一列的数相当于一维数组中的一个数,每到i加1,调用maxSubArray(int a[], int n)找出这个一维数组的最大子数组之和,再将它与maxnum作比较看哪个更大。

缺陷:时间复杂度还是很大,而且这个最大子数组也没想到怎么输出

4.测试:

当n=4时

当n=50时

时间: 2024-10-08 15:33:40

二维数组的最大值的相关文章

二维数组求最大值

设计思想:      首先要用一段代码,可以读入txt文件里的二维数组.需要将txt文件放入同一目录.       其次要用一段代码得到最大子数组的和:主要思路与求一维数组方法相差不多,不过要有更多的循环和判断汲取了先者的成果,我们得出了方法.思路如下: 1.得到子数组的最大行.列数,从第一行开始,确定最大子数组的行列范围. 2.将确定的范围,把最大子数组按照一列有几个数,按行分开成.(例如第一个组中只有一行,而第二个组中有两行,列数和数组的列数保持一致) 3,对2中得到的数组,利用一维数组求子

二维数组找最大值

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 我得思路是从左上角开始,即arr[0][0],将这个整数和它相比,如果比它大,那么将这个整数和arr[1][1]比 如果还大那么继续,如果小于arr[n][n],那么去arr[n][n]这个元素的左面和上面找,如果有说明在这个数组中 没有说明不在 这个想法首先只适用于方阵,并且查找效率并不是最好 答案的解法是从左下角开始 如果整

js 输出二维数组的最大值

function num(arr){ max=a[0][0]; for (var i = 0; i < a.length; i++) { for (var j = 0; j< a[i].length; j++) { if (max<a[i][j]) { max=a[i][j]; } } } alert(max); } var a=[[5,6,7],[15,16,8,7],[3,23,44,55,66]]; num(a);

取二维数组最大值

//取二维数组最大值 var test=[[1,34],[456,2,3,44,234],[4567,1,4,5,6],[34,78,23,1]]; //1. junior    function getMaxOne(arr){        var tmp=[];        for(var i=0;i<arr.length;i++){            tmp[i]=0;            for(var j=0;j<arr[i].length;j++){ if(tmp[i]&l

环形二维数组求最大子矩阵

1.设计思路 结合环一位数组的开发经验,拓展到二维.与前者主要是时间复杂度没有做处理. 2.源代码 1 //作者:王炳午.董龙洋.日期:2015.3.24. 2 #include <iostream> 3 #include<stdlib.h> 4 #include<time.h> 5 using namespace std; 6 int maxMax(int amax[]) //求最大 7 { 8 int i; 9 int sum = 0; 10 int max; 11

一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变访问数组的方式

 打印数组中的每个元素,打印每个元素的地址: #include <stdio.h> #include <stdlib.h> void main(void) { int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for (int *p = a; p < a + 10;p++)  //指针类型决定4个字节 { printf("\n%p,%d", p, *p); } getchar(); } 指针数组 #inclu

七、二维数组

1.只有一个下标的数组称为一维数组,有两个下标的数组称为二维数组,有N个下标的数组称为n维数组. 2.二维数组定义: 类型说明符 数组名[常量表达式1][常量表达式2] = {值1,值2,...}: int a[2][3] = {{7,6,3},{2,8,5}}; 说明2行3列的数组 3.常量表达式1表示第一维下标的长度 常量表达式2表示第二维下标的长度 4.二维数组的元素也称为双下标变量 5.赋值一般与两层for循环嵌套(双循环)使用.外层循环控制行数,内层循环控制每行对应的列数. 6.二维数

《剑指Offer》面试题:二维数组中的查找

题目 题目:在一个二维数组中,每一行都按照从左到右的顺序进行了排序,每一列都按照从上到下进行了排序. 输入这样的一个二维数组arr和一个整数k,判断数组中是否存在这个数. 思路 由于数组时有序的这样一个前提,因此 从右上角开始查找 :如果要查找的数比右上角的值大,则查找范围删除掉(并不是实际的删除,只需要改变下标即可)这一行,如果要查找的数比右上角的值小,则查找范围删除掉这一列:这样就可以将查找范围逐渐缩小,直至完成搜索 当然也可以从右下角开始查找,但是不可以从左上角或者是左下角开始查找(因为这

二维数组最大值

1.题目:返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 2.设计思路 我们刚开始时是这么想的:就是最笨的方法:求每一个子矩阵的和,然后找最大值,我们知道这种方法会比较麻烦.后来我们联想到了上次写的一维数组,就想把二维数组转化为一维数组,然后按照一维数组的方法来做. 那么问题来了,把二维数组转化为一维数组后,怎么可以保证是连续的一个