首页 > 代码库 > 数据结构和算法之
数据结构和算法之
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 }
数据结构和算法之
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。