求子数组的最大和

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

 1 #include <iostream>
 2 #include <ctime>
 3 #include <random>
 4 
 5 using namespace std;
 6 
 7 /*************************************************
 8 Function:       // maxSubArray
 9 Description:    // 求整数数组中子数组的最大和。这个
10                    方法使用空间换时间,通过存储数组总的
11                    个循环中的子数组最大和来实现时间为o(n)
12 Input:          // array:要求子数组的最大和的整数数组
13                 // size: 数组长度
14 Return:         // 无
15 *************************************************/
16 
17 void maxSubArray(int *array, int size)
18 {
19     int *sumArray = new int[size];
20     int maxIndex;
21     //记录各个节点的子数组的最大和
22     sumArray[size - 1] = array[size - 1];
23     //最大和在数组中的索引
24     maxIndex = size - 1;
25     int temp;
26     for(int i = size - 2; i >= 0; i--)
27     {    
28         //设置当前几点的最大和
29         if(sumArray[i + 1] >= 0)
30         {
31             temp = array[i] + sumArray[i + 1];
32             if (temp >= 0)
33             {
34                 sumArray[i] = temp;
35                 //更新最大和索引
36                 if(temp > sumArray[maxIndex])
37                 {
38                     maxIndex = i;
39                 }
40             }
41             else
42             {
43                 sumArray[i] = array[i];
44             }
45         }
46         else
47         {
48             sumArray[i] = array[i];
49             if (array[i] > sumArray[maxIndex])
50             {
51                 maxIndex = i;
52             }
53         }
54     }
55     cout << sumArray[maxIndex] << endl;
56 }
57 
58 void main()
59 {
60     int arr[8];
61     srand(time(0));
62     for(int i = 0; i < 8; i++)
63     {
64         arr[i] = 5 - rand() % 11;
65         cout << arr[i] << " ";
66     }
67     cout << endl;
68     maxSubArray(arr, 8);
69 }

转载于:https://www.cnblogs.com/liuxg/archive/2013/04/10/3012441.html

猜你喜欢

转载自blog.csdn.net/weixin_34258782/article/details/93433703
今日推荐