zoukankan      html  css  js  c++  java
  • 求最大子数组02

    题目:整数数组中最大子数组的和

    要求:

    1. 输入一个整形数组,数组里有正数也有负数。
    2. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
    3. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大。
    4. 同时返回最大子数组的位置。 求所有子数组的和的最大值。

    这次任务多了一个要求就是这个数组是环形的,

    也就是可以从A[i-1],…… A[n-1],A[0],A[1]这样的数组也阔以,那么首先想到的就是循环链表,然后控制求和的子数组长度即可,但是,链表首元素从哪定呢。。。用DP的话终止条件怎么设置。。。

    所以我感觉这个方法可能不太好走,于是,想到了既然是个环形的数组,那子数组也要有要求吧,如果数组元素全部之和为正,

    那么一直循环下去求和子数组的和岂不是+∞,这样下去还能了得。。。

    ,子数组的长度一定小于等于原数组,那么两个数组Arr首尾相接构成的新数组肯定可以包含所有子数组,

    然后再打表求所有子数组的和,再求max,这不手到擒来嘛,赶紧的码起

     1 #include <iostream>
     2 #include <vector>
     3 using namespace std;
     4 #define max_Num 100
     5 int main(int argc, char *argv[])
     6 {
     7     int a[]={115,15,-565,9465,-66,11,15,9400};
     8     vector<int> arr(a,a+(int)(sizeof(a)/sizeof(int)));
     9     arr.insert(arr.end(),arr.begin(),arr.end());
    10     int arrtemp[max_Num][max_Num]={0};         //记录数列之和的表  arrtemp[i][j]表示为子数组arr中[i,j]元素之和
    11     for(int i = 0;i <(int)(arr.size()/2); i++)
    12     {
    13         for(int j = 0;j<(int)(arr.size());j++)
    14         {
    15             if((i <= j) && (j < i + (int)(arr.size()/2)))  //i<=j控制元素顺序,j <i+length控制子数列长度
    16             {
    17                 for(int k = i; k <= j; k++)
    18                 {
    19                     arrtemp[i][j] += arr[k];
    20                 }
    21             }
    22         }
    23     }
    24 
    25     int maxtemp = arrtemp[0][0];   //临时最大值设为arr[0][0]即 arr[0]
    26     int start = 0;
    27     int end = 0;
    28     for(int i = 0;i < (int)(arr.size()/2); i++)
    29     {
    30         for(int j = 0;j < (int)(arr.size());j++)
    31         {
    32             if((i <= j) && (j < (int)(i+arr.size()/2)))  //i<=j控制元素顺序,j<i+length控制子数列长度
    33             {
    34                 if( arrtemp[i][j] > maxtemp)
    35                 {
    36                     maxtemp = arrtemp[i][j];
    37                     start = i;
    38                     end = j;
    39                 }
    40             }
    41         }
    42     }
    43 
    44     cout <<"sum:"<< maxtemp <<"start:"<< start <<"end:"<<end % (arr.size() / 2) <<endl;
    45     return 0;
    46 }
    (i <= j) && (j < (int)(i+arr.size()/2))是控制元素求和用的,比如一个数组有4个元素,那么求和打表的内容只能填充到
    O O O O X X X X
    X O O O O X X X
    X X O O O O X X
    X X X O O O O X
    中 O 的位置,其他位置不可能是子数组之和。

    这个程序的复杂度是O(n2) ,
    然后注意的是存放临时子数组和的二位数组不能设置太大, 不然会内存溢出。。。。不懂啊 ,我才设1000*1000,就爆了,在QT creator上调试了好久也找不到错,拿到VS上就提示stack overflow
    也是醉了。。
    日期 听课 编程 读书 看代码 写博客 总结
    星期一 120 120   150   390
    星期二   60   120   180
    星期三       90   90
    星期四 120 120   60   300
    星期五       120   120
    星期六   60       60
    星期日   240     90 330
    周总结 240 600 0 540 90 1470













    缺陷记录日志
    日期 编号 类型 引入阶段 排除阶段 修复时间 修复缺陷
    3/27 1 stack overflow 编码 调试 20min  






    我的小组成员:刘伟
  • 相关阅读:
    Nginx的configure各项中文说明
    nginx+keepalived高可用及双主模式
    nginx实现请求的负载均衡 + keepalived实现nginx的高可用
    Keepalived详细介绍简介
    keepalived vip漂移基本原理及选举算法
    keepalived脑裂问题查找
    计算机网络的三种通讯模式(单播,广播,组播)
    二层交换机、三层交换机、路由器
    Linux /var/log下的各种日志文件详解
    报文、帧、数据包等的区别
  • 原文地址:https://www.cnblogs.com/xiaoxt/p/5324923.html
Copyright © 2011-2022 走看看