Leetcode[53]分治算法求解最长子串和问题
来源:互联网 发布:get it beauty2016 编辑:程序博客网 时间:2024/06/17 04:15
问题描述:找到一个数组的最长连续子串和问题。
例如:Input:[-2,1,-3,4,-1,2,1,-5,4] Output:[4,-1,2,1] maxSum=6;
问题思考:
思路1:暴力求解
for(int i=0;i<length-1;i++){for(int j=i;j<length;j++){ sum=Num[i]+....Num[j]; max=max>sum?max:sum;}}该算法简单易懂,但是往往时间消耗比较大
思路2:分治算法
divide:将串平均分为两段,如下代码第6行。分别处理两个子串,并拼接计算。
conquer: 计算1.自身包含左端的最大子串;2.包含右端的最大子串;(这两个子串用于与其他子串拼接);3.自身的最大子串。
class Solution {public: int MaxSubSum(vector<int>& a,int left,int right){ int sum=0; if(left>right) return 0; if(left==right){ sum=a[left]>a[right]?a[left]:a[right]; return sum; } int leftSum=MaxSubSum(a,left,(left+right)/2); int rightSum=MaxSubSum(a,1+(left+right)/2,right); int s1,sum1=0,sum2=0,s2,n=right-left+1; s1=a[left+n/2-1]; s2=a[left+n/2]; for(int i=left+n/2-1;i>=left;i--){ sum+=a[i]; if(sum1>s1) s1=sum1; } for(int i=left+n/2;i<=right;i++){ sum2+=a[i]; if(sum2>s2) s2=sum2; } sum=s1+s2; sum=sum>leftSum?sum:leftSum; sum=sum>rightSum?sum:rightSum; return sum; } int maxSubArray(vector<int>& nums) { return MaxSubSum(nums,0,nums.size()-1); }};
0 0
- Leetcode[53]分治算法求解最长子串和问题
- 分治法和动态规划求解最长公共子串
- 分治算法之最长子段和问题(Java)
- 分治算法求最长子序列和
- 【算法学习】最大子数组问题的分治法求解
- 最大子数组问题的分治求解算法
- 算法导论--分治策略求解最大子数组问题
- #初学算法#分治策略---最大子数列的暴力求解和分治求解对比
- LeetCode[50]分治算法求解power(double,int)问题
- [算法论文]最长递增子序列问题的求解
- 算法笔记:动态规划求解最长子序列问题
- LeetCode 53 分治算法,求最大子串
- 最大子序列和问题 分治算法
- 最长子段问题求解
- C++ 最长子数组问题求解——分治法(递归)
- 算法学习之二——用DP和备忘录算法求解最长公共子序列问题
- 分治法求解最大子数组问题
- 分治策略求解最大子数组问题
- 图像滤波去噪分析及其应用,code全共享
- Linux系统分区过程
- Java的socket编程
- 2017.3.5 yveh测试
- 医疗电子硬件工程师应聘要求
- Leetcode[53]分治算法求解最长子串和问题
- 随机
- 浅谈前端项目管理
- 网站优化--YaHoo Web优化的14条法则
- 128. Longest Consecutive Sequence
- C++声明和定义
- react中的ajax封装
- Mybatis代码自动生成-mybatis-generator的使用
- python库之requests