首页 > 代码库 > 数据结构和算法之

数据结构和算法之

1.题目描述

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

2.动态规划

  设currSum(i)为前i个元素中,以第i个元素为结尾,和最大的连续子数组的和。那么可得一下递推公式

      currSum(i+1) =  currSum(i) + a(i) (currSum >= 0)

                  a(i)                     (currSum < 0)

    以上公式很好理解,对于currSum(i+1)来说,等于currSum(i)加上 a[i],但如果currSum(i) < 0,加上一个负数的话,一定会比不加小,所以索性不加

  那么求数组a[n]的最大子数组的问题,就转化成在Max (currSum(i)) (1<= i <=size)   

 

  基于以上的思想,总结出以下两总实现

  1. 此实现中的借用一个辅助的数组currSum[n],currSum[i]代表以i个元素为结尾的所有子数组中的最大和

    首先遍历数组a[n],得到currSum[n],然后从数组currSum[n]的所有元素中找到最大的那个即可得到答案       

 1 // Author : Jincheng
 2 // Date : 170315
 3 // Description : find max sum of subarray by DP method
 4 // Complexity : Time O(n) Space O(n)
 5 
 6 #include <iostream>
 7 using  namespace std;
 8 
 9 template <typename T>
10 void Print(T *a,int size);
11 
12 template <typename T>
13 void MaxSumSubarray(T *a,int size)
14 {
15     T *currSum = new T[size+1]; // 辅助数组
16     currSum[1] = a[1]; 
17     T maxSum ; // 全局的最大值
18     for(int i = 2;i <= size;i++)
19     {
20         if(currSum[i-1] < 0)
21         {
22             currSum[i] = a[i];
23         }
24         else 
25         {
26             currSum[i] += a[i];
27         }
28     }
29     maxSum = [1];
30     for(int i = 2;i<=size;i++)
31     {    
32         if(maxSum < currSum[i])
33         {
34             maxSum = currSum[i];
35         }
36     }
37     cout << "the max sum of subarray is " << maxSum << endl;
38 
39     delete b;
40 }
41 
42 int main()
43 {
44     int a[] = {0,-1,-2,-7,-8,-5};
45     Print(a,5);
46     MaxSumSubarray(a,5);47     return 0;
48 }
50 
51 template <typename T>
52 void Print(T *a,int size)
53 {
54     for(int i=1;i <= size;i++)
55         
56         cout << "a[" << i << "] = " << a[i] << endl;
57 }

 

数据结构和算法之