主要思路是,
1.从第一个不小于等于0的数字开始累加,直到累加之和小于等于0为止,记录这一过程中的最大值(以及坐标)。
2.剩下的数字继续重复1的操作,得到新一轮的最大值(以及坐标),并和之前记录的最大值做对比,更新最大值为两者的最大值。
3.遍历结束即可得到最终连续之和最大的最大值和与之相对应的连续数字的坐标起止坐标对。
import com.beust.jcommander.internal.Lists; import java.util.ArrayList; import java.util.List; /** * * @author zhongchenghui */ public class MaxSumConstantlyNumbers { public static void main(String[] args) { List<Integer> list = Lists.newArrayList(-1, 3, -2, 4, 5, 7, 3, -5, 3, -16, 9, 10, -12, -8, 20, -20, 12, 5, 3); find(list); } public static void find(List<Integer> list) { List<IndexPair> indexPairs = new ArrayList<>(); int maxTotal = Integer.MIN_VALUE; int startIndex = 0; int endIndex = 0; int currentMaxTotal = 0; int currentIndex = 0; int currentTotal = 0; for (Integer i : list) { currentTotal += i; currentIndex++; if (currentTotal > 0) { if (currentTotal >= currentMaxTotal) { endIndex = currentIndex; currentMaxTotal = currentTotal; } } else { if (currentMaxTotal >= maxTotal) { if (currentMaxTotal > maxTotal) { indexPairs.clear(); } final IndexPair indexPair = new IndexPair(startIndex, endIndex); indexPairs.add(indexPair); maxTotal = currentMaxTotal; } startIndex = currentIndex; } } if (currentMaxTotal >= maxTotal) { if (currentMaxTotal > maxTotal) { indexPairs.clear(); } final IndexPair indexPair = new IndexPair(startIndex, endIndex); indexPairs.add(indexPair); maxTotal = currentMaxTotal; } for (IndexPair indexPair : indexPairs) { System.out.println(indexPair); System.out.println(list.subList(indexPair.startIndex, indexPair.endIndex)); System.out.println(); } System.out.println("最大值为:" + maxTotal); } public static class IndexPair { int startIndex; int endIndex; public IndexPair(int startIndex, int endIndex) { IndexPair.this.startIndex = startIndex; IndexPair.this.endIndex = endIndex; } @Override public String toString() { return "IndexPair{" + "startIndex=" + startIndex + ", endIndex=" + endIndex + '}'; } } }
以上答案有待改进。一遍遍历之后只是找出了每个子串的起止位置,而后再根据起止位置截取子串。更好的做法是在遍历过程中就把子串保存下来。
相关推荐
这个问题要求从给定的数组中找到一个连续子数组,使得这个子数组的元素之和最大。这个问题有多种解法,包括暴力枚举、贪心算法和动态规划。这里我们将详细探讨这些方法,并延伸到与之相关的"最大连续子矩阵"问题。 ...
4. **找出最长的连续数字串**:比较所有连续数字串的长度,返回最长的那个。 #### 改进后的解决方案 ##### 1. 正确匹配连续数字串 - 使用正则表达式`\d+`来匹配一个或多个连续数字是正确的。 - 示例代码已经正确...
总结来说,Java中找出数字字符串的方法多种多样,可以根据实际需求选择合适的方法。如果数字字符串连续,可以使用简单的遍历和条件判断;如果需要处理复杂的字符串,如数字间可能包含非数字字符,可以借助正则表达式...
- 给定一个字符串,找出其中最长的连续数字子串。 - 可以使用循环结构和计数器变量实现最长子串的查找。 50. **学生成绩管理系统**: - 设计一个简单的学生成绩管理系统,实现成绩录入、查询等功能。 - 需要...
解题的关键在于如何有效地找出这些符合条件的子串。一种称为“01压缩”的思路是,将连续的0和1压缩成它们的长度,比如将 "110001101110000" 压缩成 "232134"。这样,我们只需关注相邻数字之间的关系,因为有效子串在...
2. **两数之和**: - 在一个整数数组中找到两个数,使得它们的和等于给定的目标值。考察哈希表的运用,提高查找效率。 3. **斐波那契数列**: - 实现一个函数,计算斐波那契数列的第n项。可以使用迭代或递归方法...
- 描述:找出给定字符串中的最长回文子串。 - 关键技术:中心扩展法,从每个可能的中心点向外扩展。 ### 栈和队列 栈和队列是两种常见的抽象数据类型,它们在算法设计中扮演重要角色。 #### 栈 栈是一种先进后出...
首先,问题的核心是找出并删除字符串中连续重复的字符。例如,对于字符串"111111kakkkkkkkkkkwwwaacbbdAAA",我们期望得到的结果是"1kawcdbA",其中连续的重复字符只保留一个。 要实现这个功能,我们可以利用Java的...
- **Manacher's Algorithm**:在线性时间内找出字符串中的所有回文子串。 6. **数据结构** - **栈(Stack)**:后进先出(LIFO)的数据结构,常用于表达式求解、括号匹配等。 - **队列(Queue)**:先进先出...
- **Floyd-Warshall算法**:找出所有顶点对之间的最短路径,适合处理稠密图。 - **Prim算法**和**Kruskal算法**:用于找到图的最小生成树,前者基于贪心策略,后者通过连接最小边来构建。 4. **动态规划**: - *...
在Java编程中,题目所描述的任务是找到一个字符串中的最长连续数字子串并将其打印出来。这个任务可以作为字符串处理和正则表达式应用的一个经典示例。下面将详细介绍如何实现这一功能。 首先,我们需要创建一个Java...
21. **组合总和**:该问题要求找出所有和为给定值的组合,这需要使用回溯算法。 ### Java编程知识点 - **Java基础**:在解决上述问题时,会用到Java的基础语法,如变量声明、循环、条件判断、数组、集合类操作等。...
例如,使用正则表达式可以轻松找出所有以"the"开头的单词,或者所有包含连续数字的序列。在Java中,`java.util.regex`包提供了Pattern和Matcher类,支持正则表达式的编译和匹配操作。 这个NLP正则表达式分析程序...
13. 给定一个包含数字的大文件或者连续的数字流,找出第k大的数字。这涉及到数据流处理算法。 14. C++多重继承的缺点。C++允许类多重继承,但带来了菱形继承问题,即一个类通过两个不同的基类继承相同的成员。 15....
问题要求解算法来找出所有可能的子串B,警察的线索是Mr. Banana Brain给他的助手一个串有他们将要袭击的房屋形状的项链。由于Mr. Banana Brain不擅长设计,他给的项链上的序列无法让人理解从哪里开始。 从这些描述...
在LeetCode中,经常会有涉及数组操作的问题,如两数之和、寻找数组中的最长连续序列等。 2. **哈希表**:哈希表,如Java中的HashMap,是通过键值对实现快速查找的数据结构。在解决LeetCode问题时,哈希表常用于查找...
- 这道题目要求编写一个函数,找出以`\0`结束的字符串中最长的连续数字子串的长度,同时返回这个子串的起始位置。它使用了一个计数器`count`记录当前连续数字的个数,当遇到非数字字符时,更新最大子串长度`max`。 ...
括号的最大嵌套深度则需要理解栈的特性来找出最大的嵌套深度。 5. **排列组合**:这两题,如leetcode 面试题08.08.有重复字符串的排列组合和leetcode 77.组合,都涉及组合数学和数组的遍历。 6. **双指针**:双...