053 - Maximum Subarray
2015-11-26 18:26
218 查看
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array
the contiguous subarray
click to show more practice.
More practice:
If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.
int domerge(int *nums, int *nsize)
{
int kk = 0, k = *nsize, i;
if (nums[0] < 0) kk++;
for (i = kk+1; i <= k; i++) {
if (nums[i] < 0) {
if (i == k) break;
if (nums[i] + nums[kk] >= 0 && nums[i] + nums[i + 1] >= 0) {
nums[kk] += nums[i] + nums[i + 1];
i++;
} else {
nums[++kk] = nums[i];
}
} else {
if (nums[kk] >= 0)
nums[kk] += nums[i];
else
nums[++kk] = nums[i];
}
}
if (kk == *nsize) return 0;
*nsize = kk;
return 1;
}
int listmax(int *nums, int numsSize)
{
if (numsSize < 1) return 0;
if (numsSize == 1) return nums[0];
if (nums[0] <= 0) return nums[0] + listmax(nums + 1, numsSize - 1);
int nextgt0 = listmax(nums + 2, numsSize - 2);
if (nums[1] + nextgt0 >= 0)
return nums[0] + nums[1] + nextgt0;
else
return nums[0];
}
int maxSubArray(int *nums, int numsSize)
{
int max = INT_MIN;
int i, k = 0;
if (!numsSize) return 0;
/* merge +/- */
for( i = 0 ; i < numsSize ; i++ ) {
if (nums[i] > max) max = nums[i];
if (!i || !nums[i]) continue;
if (nums[i] >= 0) {
if (nums[k] >= 0) nums[k] += nums[i];
else nums[++k] = nums[i];
} else {
if (nums[k] > 0) nums[++k] = nums[i];
else nums[k] += nums[i];
}
}
if (k == 0) return nums[k] <= 0? max:nums[k];
/* merge +a -b +c --> a+b>=0 && b+c>=0 */
while (domerge(nums, &k))
;
max = INT_MIN;
int left = 0, right = k, sum;
while (left <= right) {
if (nums[left] <= 0) {
left++;
continue;
}
sum = listmax(nums + left, k+1-left);
if (sum > max) max = sum;
left++;
}
return max;
}
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.
click to show more practice.
More practice:
If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.
int domerge(int *nums, int *nsize)
{
int kk = 0, k = *nsize, i;
if (nums[0] < 0) kk++;
for (i = kk+1; i <= k; i++) {
if (nums[i] < 0) {
if (i == k) break;
if (nums[i] + nums[kk] >= 0 && nums[i] + nums[i + 1] >= 0) {
nums[kk] += nums[i] + nums[i + 1];
i++;
} else {
nums[++kk] = nums[i];
}
} else {
if (nums[kk] >= 0)
nums[kk] += nums[i];
else
nums[++kk] = nums[i];
}
}
if (kk == *nsize) return 0;
*nsize = kk;
return 1;
}
int listmax(int *nums, int numsSize)
{
if (numsSize < 1) return 0;
if (numsSize == 1) return nums[0];
if (nums[0] <= 0) return nums[0] + listmax(nums + 1, numsSize - 1);
int nextgt0 = listmax(nums + 2, numsSize - 2);
if (nums[1] + nextgt0 >= 0)
return nums[0] + nums[1] + nextgt0;
else
return nums[0];
}
int maxSubArray(int *nums, int numsSize)
{
int max = INT_MIN;
int i, k = 0;
if (!numsSize) return 0;
/* merge +/- */
for( i = 0 ; i < numsSize ; i++ ) {
if (nums[i] > max) max = nums[i];
if (!i || !nums[i]) continue;
if (nums[i] >= 0) {
if (nums[k] >= 0) nums[k] += nums[i];
else nums[++k] = nums[i];
} else {
if (nums[k] > 0) nums[++k] = nums[i];
else nums[k] += nums[i];
}
}
if (k == 0) return nums[k] <= 0? max:nums[k];
/* merge +a -b +c --> a+b>=0 && b+c>=0 */
while (domerge(nums, &k))
;
max = INT_MIN;
int left = 0, right = k, sum;
while (left <= right) {
if (nums[left] <= 0) {
left++;
continue;
}
sum = listmax(nums + left, k+1-left);
if (sum > max) max = sum;
left++;
}
return max;
}
相关文章推荐
- 练手小程序(一)
- hdu 2063 过山车(纯裸hungary算法)
- 给UILabel局部文字添加颜色
- 【Project Euler 8】Largest product in a series
- 在/sys下面创建属性文件
- openfiler之iscsi 安装远端挂载
- tengine安装
- 学习Android开发相关站点汇总
- 性能测试
- 052 - N-Queens II
- nyoj--46--最少乘法次数(数学+技巧)
- Android 关于上文中第三方开源PinnedSectionListView异常崩溃报错问题解决方案
- 利用CSS3 @font-face使用图标字体
- Eclipse卡死解决汇总
- PyScripter显示行号
- nyoj--46--最少乘法次数(数学+技巧)
- 051 - N-Queens
- 卡特兰数
- 二分图的最大匹配、完美匹配和匈牙利算法
- JFlow 入门,新手流程设计教程