算法导论(第三版) Exercises4.2(求最大和子数组的算法优化过程)
4.1-1
如所有元素都为负,则返回所有元素中最大的负数。
4.1-2(暴力法求最大和子数组)
struct subarray
{
int start, end, sum;
};
void bruteFindMaxSubarray(int a[], int left, int right, struct subarray* result)
{
int i, j, sum=a[left];
int tempSum;
int l = left;
int r = l;
for(i=left; i<=right; i++)
{
tempSum = a[i];
for(j=i+; j<=right; j++)
{
tempSum += a[j];
if(tempSum > sum)
{
l = i;
r = j;
sum = tempSum;
}
}
}
result->start = l;
result->end = r;
result->sum = sum;
}
4.1-3(归并算法求最大和子数组)
int mergeFindSub(int a[], int l, int r, int result[])
{
int i, j, k, mid;
int leftSum = ;
int rightSum = ;
int crossSum = ;
int leftResult[] = {};
int rightResult[] = {};
int crossResult[] = {};
if(l == r)
{
result[] = l;
result[] = r;
result[] = a[l];
}
else
{
mid = (l + r) / ;
leftSum = mergeFindSub(a, l, mid, leftResult);
rightSum = mergeFindSub(a, mid+, r, rightResult);
crossSum = crossingSub(a, l, mid, r, crossResult);
if(leftSum >= rightSum && leftSum >= crossSum)
for(i=; i<; i++) result[i] = leftResult[i];
else if(rightSum >= leftSum && rightSum >= crossSum)
for(j=; j<; j++) result[j] = rightResult[j];
else
for(k=; k<; k++) result[k] = crossResult[k];
}
return result[];
} int crossingSub(int a[], int l, int m, int r, int result[])
{
int i, j, leftSum, rightSum, sum;
int min = -;
rightSum = min;
leftSum = min;
sum = ;
for(i=m; i>=l; i--)
{
sum += a[i];
if(sum > leftSum)
{
result[] = i;
leftSum = sum;
}
}
sum = ;
for(j=m+; j<=r; j++)
{
sum += a[j];
if(sum > rightSum)
{
result[] = j;
rightSum = sum;
}
}
result[] = leftSum + rightSum;
return result[];
}
4.1-4
如果允许空串,只要加一句
if (sum < 0) return sum=0;
4.1-5(线性算法求最大和字串)
void linearFindSub(int a[], int n, int result[])
{
int i, l, temp, sum;
int min = -;
sum = min;
temp = ;
l = ;
for(i=; i<n; i++)
{
if(temp < )
{
temp = a[i];
l = i;
}
else
temp += a[i];
if(sum < temp)
{
result[] = l;
result[] = i;
sum = temp;
}
}
result[] = sum;
}
算法导论(第三版) Exercises4.2(求最大和子数组的算法优化过程)的更多相关文章
- 算法导论(第三版)Exercises2.3(归并排序、二分查找、计算集合中是否有和为X的2个元素)
2.3-1: 3 9 26 38 41 49 52 59 3 26 41 52 9 38 49 57 3 41 52 26 38 57 9 49 3 41 52 26 38 ...
- 算法导论(第三版)Problems2(归并插入排序、数列逆序计算)
讨论内容不说明,仅提供相应的程序. 2.1:归并插入排序θ(nlgn) void mergeInsertionSort(int a[], int l, int r, int k) { int m; & ...
- 算法导论(第三版)Exercises2.1(插入排序、线性查找、N位大数相加)
关于练习程序的说明参见置顶的那篇. 2.1-1: 31 41 59 26 41 58 31 41 59 26 41 58 31 41 59 26 41 58 26 31 41 59 41 58 26 ...
- 求数组的子数组之和的最大值II
这次在求数组的子数组之和的最大值的条件下又增加了新的约束: 1.要求数组从文件读取. 2.如果输入的数组很大, 并且有很多大的数字, 就会产生比较大的结果 (考虑一下数的溢出), 请保 ...
- C#中求数组的子数组之和的最大值
<编程之美>183页,问题2.14——求子数组的字数组之和的最大值.(整数数组) 我开始以为可以从数组中随意抽调元素组成子数组,于是就有了一种想法,把最大的元素抽出来,判断是大于0还是小于 ...
- 求数组的子数组之和的最大值III(循环数组)
新的要求:一维数组改成循环数组,只是涉及简单算法,只是拿了小数做测试 想法:从文件读取数组,然后新建数组,将文件读取的数组在新数组中做一下连接,成为二倍长度的数组,然后再遍历,将每次遍历的子数组的和存 ...
- 算法导论 第三章 and 第四章
第三章 渐进的基本O().... 常用函数 % 和 // 转换 斯特林近似公式 斐波那契数 第四章 分治策略:分解(递归)--解决(递归触底)--合并 求解递归式的3种方法: 1:代入法(替代法): ...
- "《算法导论》之‘图’":不带权二分图最大匹配(匈牙利算法)
博文“二分图的最大匹配.完美匹配和匈牙利算法”对二分图相关的几个概念讲的特别形象,特别容易理解.本文介绍部分主要摘自此博文. 还有其他可参考博文: 趣写算法系列之--匈牙利算法 用于二分图匹配的匈牙利 ...
- 算法Sedgewick第四版-第1章基础-002一些工具类算法(Euclid’s algorithm)
1. //Euclid’s algorithm public static int gcd(int p, int q) { if (q == 0) return p; int r = p % q; r ...
随机推荐
- Spring容器的工具类
代码实现: package com.ht.util; import java.util.Map; import org.springframework.beans.BeansException; im ...
- linux比较指令comm、diff、grep -Ff
Comm命令 如果想对两个有序的文件进行比较,可以使用comm命令. 语法:comm [- 123 ] file1 file2 说明:该命令是对两个已经排好序的文件进行比较.其中file1和file2 ...
- Python进阶(面向对象编程基础)(二)
1.初始化实例属性 #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'ziv·chan' #定义Person类的__init__方法 ...
- (转)Apple Push Notification Services in iOS 6 Tutorial: Part 2/2
转自:http://www.raywenderlich.com/32963/apple-push-notification-services-in-ios-6-tutorial-part-2 Upda ...
- AxisFault另外一个问题
出现以下情况,能够是proxy.setEndpoint(endpoint);中endpoint不正确导致 因该是:endpoint = http://127.0.0.1/8080/项目名/servic ...
- UE4学习笔记(三): 为什么使用C++替代UnrealScript?
原文链接: https://forums.unrealengine.com/showthread.php?2574-Why-C-for-Unreal-4&p=16252&viewful ...
- Android实现图片放大缩小
package com.min.Test_Gallery; import android.app.Activity; import android.graphics.Bitmap; import an ...
- C++中虚函数的作用是什么?它应该怎么用呢?(转)
虚函数联系到多态,多态联系到继承.所以本文中都是在继承层次上做文章.没了继承,什么都没得谈. 下面是对C++的虚函数这玩意儿的理解. 一, 什么是虚函数(如果不知道虚函数为何物,但有急切的想知道,那你 ...
- 用GDB调试多进程程序
在子进程中sleep.然后attach上去. gdb --pid=123456 ps出子进程的id,gdb attach 进程号. http://www.ibm.com/developerworks/ ...
- Qt 格式化字符串
Qt字符串格式化性能比较 Qt字符串格式方法有三种, QString::arg(), QString::sprinft()和QStringList::join().今天我做了个简单的性能测试, 希望对 ...