今天做的笔试的算法题。。。泪目啊
又一次被恒生的笔试捏哭。。。T_T||
算法真是头疼。找一个数组的最大和的连续子数组(时间复杂度 O(n)),当时快交卷了,随便一想感觉是找到负数后,再向两边找更多的正数。太2了。不过第一感觉是要不断求和比较,其实在想一下就和答案连接上了。时间不够的伤啊。。。果然直觉是最对的。
这里贴上原帖的正确解法,一看才发现这题只是把原来的查找一个数变成了查找sum而已,嗯,果然脑子锈掉了。。。
下面是转载的一段算法思路(说的有点绕):
由于数组中的元素可能是正负,所以连续的子组求和,会变大也可能变小,解题时首先要求当前的和(初始值为0)和下一个元素求和后,如果是负的,那么重新置0和下下个继续求和,首先要找到使和增加的正的元素。然后有了当前最大的和后,纪录下来;继续累加求和,若新增的元素使和变为负数,那么重新置0,按这个逻辑找出剩余元素的一个最大子组和,若超过前纪录,覆盖,直到子组遍历结束。
public class FindMaxSumOfSubArray {
public static void main(String[] args) {
FindMaxSumOfSubArray f = new FindMaxSumOfSubArray();
int[] arr = { 1, -2, 3, 10, -4, 7, 2, -5 };
System.out.println("MaxSum:" + f.findMaxSum(arr));
}
public Integer findMaxSum(int[] arr) {
int curSum = 0;
int maxSum = 0;
int len = arr.length;
if (arr == null || len == 0) {
return null;
}
for (int i = 0; i < len; i++) {
curSum +=

博主在恒生笔试中遇到一个算法问题,要求找到数组中最大和的连续子数组,时间复杂度为O(n)。由于时间紧张,未能给出最优解。事后发现解题关键是当和为负时,需从新开始累计,不断寻找能使和增大的正数子数组。正确解法是将寻找最大值转化为寻找最大和,博主对此感到懊悔并反思。
最低0.47元/天 解锁文章

1093

被折叠的 条评论
为什么被折叠?



