Programming pearls 8 chapter question .
/**
* User: yiminghe
* Date: 2009-2-16
* Time: 15:40:11
*/
public class LongestSubArray {
/**
* 一维数组最大的连续子数组和 [ -1 ,2,3,-5] return 5 [2,3] O(n)
*
* @param a 一维数组
* @return 最大的连续子数组和
*/
public static int getLongestOne(int[] a) {
int max = 0;
int current = 0;
for (int o : a) {
current = Math.max(current + o, 0);
max = Math.max(current, max);
}
return max;
}
/**
* 2维数组最大的连续子数组和 O(m^2n)
* [ -1 ,2,3,-5
* 0 , 3, 5 , 0]
* return 13
* [ 2,3
* 3,5]
*
* @param a2 2维数组
* @param m 行数
* @param n 列数
* @return 最大的连续子数组和
*/
public static int getLongestTwo(int[][] a2, int m, int n) {
int[][] cache = new int[m][n + 1];
int max = 0;
for (int i = 0; i < m; i++) {
cache[i][0] = 0;
for (int j = 1; j < n + 1; j++) {
cache[i][j] = cache[i][j - 1] + a2[i][j - 1];
}
}
for (int i = 0; i < n - 1; i++)
for (int j = i + 1; j < n; j++) {
int[] t = new int[m];
for (int k = 0; k < m; k++) {
t[k] = cache[k][j + 1] - cache[k][i];
}
max = Math.max(max, getLongestOne(t));
}
return max;
}
public static void main(String[] args) {
int[] a = {-1, 2, 3, -5};
int[][] b = {{-1, 2, 3, -5}, {0, 3, 5, 0}};
System.out.println(getLongestOne(a));
System.out.println(getLongestTwo(b, 2, 4));
}
}
分享到:
相关推荐
- 分治法:将大问题分解为小问题,逐个解决,例如Kadane's algorithm用于求解一维数组的最大子数组和。 - 贪心算法:每次做出局部最优决策,逐步达到全局最优,例如Prim's或Kruskal's算法用于求解最小生成树。 ...
- 使用移位寄存器从数组中索引出连续的三个随机数。 - 条件结构用于比较这三个数的大小关系,确定极值点。 - 如果中间的数值大于前一个数值且小于后一个数值,则中间数值为极小值; - 如果中间的数值小于前一个...
2.3 **区间极值问题(RMQ,Range Minimum/Maximum Query)**:在一个数组中,查询某个连续子数组内的最小或最大值。倍增算法通过构建ST表(Sparse Table)预先计算每个2的幂次子数组的极值,然后快速获取任意区间内...
最大连续子序列问题,也称为最大子数组问题,是要求找出数组中和最大的连续子数组。 上述提到的内容包含了ACM竞赛中的一些重要知识点和算法模板。掌握这些模板,对于提高解决ACM问题的效率和准确性具有重要作用。在...
5. **变分法**:在寻找极值问题解的过程中,通过变分原理将原问题转化为求泛函的极值问题。 6. **图论法**:利用图的结构和性质解决网络优化、路径规划等问题,如最小生成树、最短路径算法等。 7. **层次分析法...
快速排序是一种高效的排序算法,采用分治法的思想,通过选择一个“基准”元素,将数组分成两个子数组,分别包含小于和大于基准的元素,然后递归地对这两个子数组进行排序。 **关键步骤:** 1. **选择基准**:从...
4. **优化算法**:包括梯度下降法、牛顿法、拟牛顿法、遗传算法、粒子群优化等,这些算法在寻找函数极值或最小化问题中发挥作用。 5. **统计分析**:可能会包含均值、中位数、标准差、回归分析、假设检验等统计计算...
- 导数与微分:导数是描述函数变化率的工具,用于分析函数的局部性质,如单调性、极值和拐点。微分则是导数的应用,微分法用于求解最优化问题。 - 积分学:包括不定积分和定积分,积分是导数的逆运算,可以用来求...
数值积分和微分是解决连续问题的关键,而符号计算则允许进行精确的数学运算,而不是近似值。 学习MATLAB的一个有效方法是通过实践,频繁地使用和熟悉各种函数。结合实际课程内容,将MATLAB应用到具体问题中,可以...
2. 最值查询:可以快速找到区间内的最大值或最小值,适用于寻找连续序列中的局部极值。 3. 计数:对于区间内满足特定条件的元素个数进行计数,如统计区间内大于某个值的元素数量。 4. 模块化操作:线段树可以扩展...
**模拟时间**:包括离散事件模拟和连续时间模拟。 **模拟语言**:专门用于模拟的编程语言和工具。 **随机数的模拟**:使用随机数生成器进行仿真。 #### 二、蒙特卡罗模拟法 **模拟寻求近似圆周率**:使用随机...
递归地对左右子数组进行快速选择操作。 - **优化**:选择合适的基准可以显著提高算法的性能,例如可以选择中位数作为基准。 #### 十五、多项式乘法与快速傅里叶变换 多项式乘法是指两个多项式的乘积运算,而快速...
数列分块的核心思想是将一个长数列分成若干个较小的连续子序列,每个子序列称为一个“块”。这样做的好处在于可以减少某些操作的时间复杂度,比如查询、更新或者维护数列中的元素。当处理的数列非常大,直接线性扫描...
除了基础的数学和三角函数,SUMPRODUCT用于计算数组间元素的乘积之和,而SUMSQ、SUMX2MY2、SUMX2PY2、SUMXMY2则涉及向量和矩阵的运算。TAN、TANH函数继续扩展三角函数的功能,TRUNC函数则用于截断数字至特定的小数...
- **广义表的定义及其存储结构**:包括广义表的头尾和子表两种分析方法。 **六、树和二叉树** - **二叉树的结构特点**:包括二叉树的性质和遍历算法。 - **树的存储结构**:如孩子兄弟表示法。 - **最优二叉树**:...
在连续函数中,斜率可以帮助我们了解函数的变化趋势和局部性质,例如拐点、极值等。 LabVIEW中的斜率计算通常涉及到以下步骤: 1. 数据采集:首先,你需要获取曲线的数据。这可能来自实验测量、模拟数据或已知函数...
45. `dir`: 列出目录中的文件和子目录。 46. `dirac`: 单位冲激函数,用于信号处理。 47. `dsolve`: 解常微分方程,支持符号计算。 48. `eedit`: 编辑矩阵或打开M文件,进行交互式编辑。 49. `Ei`: Maple中的指数...
- **导数与微分的应用**: 包括函数增减性、凹凸性、极值问题等。 **1.3 积分学** - **不定积分与定积分**: 不定积分是求导的逆运算,定积分用来计算面积、体积等。 - **广义积分**: 用于处理不连续或无穷大的情况...
- **array (数组)**:元素连续存储的序列。 - **tree (树)**:层次结构,每个节点最多有一个父节点,但可以有任意数量的子节点。 - **graph (图)**:节点和边组成的集合,表示实体之间的关系。 掌握这些专业术语,...
为了绘制二维图形,我们需要将一维的x和y数组转化为二维的网格。这可以通过numpy的`meshgrid`函数实现,它会返回两个相互关联的网格矩阵,一个对应x值,另一个对应y值。 ```python x, y = np.meshgrid(x, y) ``` ...