Maximum Subarray
来源:互联网 发布:淘宝卖家刷单后果 编辑:程序博客网 时间:2024/06/08 00:16
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [-2,1,-3,4,-1,2,1,-5,4]
,
the contiguous subarray [4,-1,2,1]
has the largest sum = 6
.
分析题目,题目意思是给定一个数组,设计算法,求出这个数组的最大子序列和,算法设计思路如下:
1.如何获得该数组的子序列
2.如何求的最大和
按照常规思路,对数组的所有子序列进行穷举,然后得出最大和,代码如下:
int maxSubArray(vector<int>& nums) {
int max = nums[0], sum;
for(int i = 0; i < nums.size(); i ++) {
sum = 0;
for(int j = i; j < nums.size(); j ++) {
sum += nums[j];
if(max < sum)
max = sum;
}
}
return max;
}
这种方法因为复杂度太大,运行时显示超时,所以我们采用分治算法来降低算法的复杂度。
分治算法思路如下:
对于这个数组,我们从中间分开,递归求出数组左边最大序列和,递归求出右边序列和,求出跨越边界的序列和,三个和中最大的值即为答案。
算法设计如下;
void maxSubArray(vector<int>& nums, int left, int right, int& maxs, int& leftMax, int& rightMax, int& sum) {
if (left == right) {
maxs = nums[left];
}
else {
int mid = (left + right) / 2;
int mx1, lmx1, rmx1, sum1;
int mx2, lmx2, rmx2, sum2;
maxSubArray(nums, left, maxs, mx1, lmx1, rmx1, sum1);
maxSubArray(nums, maxs + 1, right, mx2, lmx2, rmx2, sum2);
maxs = max(max(mx1, mx2), rmx1 + lmx2);
leftMax = max(lmx1, sum1 + lmx2);
rightMax = max(rmx2, sum2 + rmx1);
sum = sum1 + sum2;
}
}
int maxSubArray(vector<int>& nums) {
if (nums.size() == 0) {
return 0;
}
int maxs, leftMax, rightMax, sum;
maxSubArray(nums, 0, nums.size() - 1, maxs, leftMax, rightMax, sum);
return maxs;
}
- maximum subarray
- Maximum Subarray
- Maximum Subarray
- Maximum Subarray
- Maximum Subarray
- Maximum Subarray
- Maximum Subarray
- Maximum Subarray
- Maximum Subarray
- Maximum Subarray
- Maximum Subarray
- Maximum Subarray
- Maximum Subarray
- Maximum Subarray
- Maximum Subarray
- Maximum Subarray
- Maximum Subarray
- Maximum Subarray
- UVA 400 Unix ls
- Java如何实现跨平台
- 数据库使用过程中遇到的问题
- 各个版本spring的jar包以及源码下载地址
- leetcode 593: Valid Square
- Maximum Subarray
- notepad++配置python环境
- 数据库表的更新和修改数据
- 哈夫曼编码生成哈夫曼树
- FastDFS简单了解
- Window上安装Tensorflow
- 在Linux上安装JDK
- 第一篇博客—c语言单链表的基本操作
- 总结《An Introduction to Ray Tracing》