求子数组的最大和
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为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 }