今天做的笔试的算法题。。。泪目啊

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

今天做的笔试的算法题。。。泪目啊

又一次被恒生的笔试捏哭。。。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 fin
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值