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. 同时返回最大子数组的位置。 求所有子数组的和的最大值。  

    这次要求数组是环形的 高逸凡同学上课的思路很清晰,在此基础上我也没有什莫更好的思路了,就是锁定节点确定子数组就好。子数组的长度一定小于等于原数组,那么两个数组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) 。

    缺陷记录日志

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




  • 相关阅读:
    Phalcon资源文件管理(Assets Management)
    LintCode 二叉树的层次遍历 II
    atitit.修复xp 操作系统--重装系统--保留原来文件不丢失
    Matlab图像处理系列2———空间域平滑滤波器
    碰撞回避算法(一) Velocity Obstacle
    APNS 那些事!
    Cordys BOP 4平台开发入门实战演练——Webservices开发(0基础)
    python 下载整个站点
    Nginx+Tomcat+memcached负载均衡实现session共享
    linux系统下安装两个或多个tomcat
  • 原文地址:https://www.cnblogs.com/liuwei8882/p/5350104.html
Copyright © 2011-2022 走看看