求数组中连续区间的和最大,并且打印该区间的下标。
最容易想到的是穷举法,和分治法。后来网上搜了一下发现动态规划来解决这个问题非常优雅,下面是动态规划法解决该问题的代码
/**
* 连续最大和问题,动态规划法
*
* @param a
*/
public static void maxSubSequence(int[] a) {
int curSum = 0;
int maxSum = a[0];
int start = 0, end = 0;
int tempStart = 0;
for (int i = 0; i < a.length; i++) {
if (curSum == 0)
tempStart = i;
curSum += a[i];
if (curSum > maxSum) {
maxSum = curSum;
end = i;
start = maxSum < 0 ? end : tempStart;
}
if (curSum < 0)
curSum = 0;
}
System.out.println("maxSum:" + maxSum + "\tstart:" + start + "\tend:"
+ end);
}
public static double random(int start, int end) {
return Math.ceil(Math.random() * (end - start) + start);
}
public static void main(String[] args) {
int[] a = { 90, 9, 0, -7, 29, 7, -99, -72, 40, 63, 96, -92, 25, -53,
-49, -6, -7, -37, 29, 39 };
int[] b = { -3, -3, -1, -4, -7, -3, -1, -5 };
maxSubSequence(a);
maxSubSequence(b);
// int start = -100;
// int end = 100;
// int[] arr = new int[20];
// for (int i = 0; i < arr.length; i++) {
// arr[i] = (int) random(start, end);
// }
// System.out.println(ArrayUtils.toString(arr));
// maxSubSequence(arr);
}
分享到:
相关推荐
用java做的求最大连续和,时间复杂度为O(n)输入的处理函数 input(a)可以作为以后处理java输入的模版
求整型数组中连续最大和与最小和额程序,使用的是动态规划法。
输出对每个测试用例,在 1 行里输出最大和、最大连续子序列的第一个和最后一个元素,中间用空格分隔。如果最大连续子序列不唯一,则输出序号 i 和 j 最小的那个。 解决该问题的算法思路是使用动态规划法。首先,...
请问,-41,59,26,-53,68,97,-93,-23,83九个数。SUM(N,M)表示从第N个数到到第M个数的和。例如:SUM(1,2)=-41+59=18。问:最大的和是多少?对应的N和M是多少?
我们可以将数组分成左半部分和右半部分,然后计算这两部分中的最大连续子序列和,最后求出总的最大值。代码实现如下: ```cpp int maxsequence2(int a[], int l, int u) { if (l > u) return 0; if (l == u) ...
解法1—O(N^2)解法 解法2—O(NlgN)解法 解法3—O(N)解法 可以直接在记事本运行
C++求最大子序列的和 问题:求一个数组 / 序列的满足条件的子数组 / 子序列。 条件: 1. 子数组必须是连续的。 2. 求和即可,不需要返回子数组是哪段。 3. 数组元素为整数。
根据提供的文件信息,我们可以归纳出三个主要的知识点:利用连续整数检测法分解质因数求最大公约数、使用欧几里得算法求最大公约数以及字符串匹配算法(包括BF、KMP和BM算法)。接下来将对这些知识点进行详细的解释...
总的来说,分治法求最大字段和问题展示了分治法如何在实际问题中发挥作用,通过分解问题、解决子问题、合并结果这三个步骤,巧妙地解决了二维数组的最大连续和问题。对于初学者来说,这是一个很好的练习,不仅可以...
在IT领域,特别是算法设计和分析中,"连续子序列最大和与乘积问题"是一个经典的话题。这类问题经常出现在数据结构和算法的面试中,也是优化和解决复杂计算问题的关键。本文将深入探讨这个问题,并结合提供的Java源码...
连续整数检测法求最大公约数算法步骤 - 输入两个正整数m和n。 - 初始化t为较小的那个数。 - 从t开始向下递减直到1。 - 检查t是否能同时被m和n整除: - 如果不能,则继续递减t; - 如果可以,则输出t并结束程序。 ...
求最大连续子数组.cpp
求连续最大子数组和的问题在实际应用中非常有用,例如在分析股票价格时找出连续一段时间内收益率最高的组合,或者在处理有噪声的数据时找到一段最接近理想状态的连续序列。 4. **优化和变体**: 虽然Kadane算法...
【Python求解数组连续最大和】 在编程中,经常遇到寻找数组中连续子数组最大和的问题,这是一个经典的算法问题,通常可以通过不同的方法解决。在Python中,有几种常见的策略,包括蛮力法、利用已计算子数组和以及...
这个查询会找出每个员工连续出勤的开始日期和结束日期,以及连续的天数。 3. **窗口函数** 另一种方法是利用窗口函数,如`LAG`和`LEAD`。这些函数可以查看当前行的前一行或后一行数据,非常适合检测连续性。例如:...
本主题将深入探讨两种C++实现最大公约数的算法:辗转相除法(也称为欧几里得算法)和连续整数检测法(也称更相减损术),并比较它们的时间复杂度。 **辗转相除法**,是古希腊数学家欧几里得提出的一种高效算法。该...
对于求最大连续子数组和的问题,我们可以维护一个变量`pre_sum`,表示到当前元素为止的最大子数组和,同时还有一个`max_sum`变量,用来记录全局的最大和。遍历数组时,如果`pre_sum`小于0,说明之前的子数组对当前子...
在本实验中,我们将探讨四个核心的算法问题:串匹配问题、最大连续子序列和问题、求众数问题以及最近点对问题。这些问题都属于算法设计与分析的范畴,通过解决这些问题,我们可以深入理解分治法和其他算法策略。 1....