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

来源:互联网 发布:黑科技和人工智能 编辑:程序博客网 时间:2024/06/11 08:44

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

又一次被恒生的笔试捏哭。。。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 += arr[i];        if (curSum < 0) {            curSum = 0;        }        if (curSum > maxSum) {            maxSum = curSum;        }    }    // all data are negative    if (maxSum == 0) {        for (int i = 0; i < len; i++) {            if (i == 0) {                maxSum = arr[i];            }            if (arr[i] > maxSum) {                maxSum = arr[i];            }        }    }    return maxSum;}

}


看完代码想撞墙,不就是把找最大值变成了找最大和吗,curSum换成temp,maxSum换成max,ohno。。。计算机二级的基础题

附上原帖地址:(http://blog.csdn.net/hpf911/article/details/9275583 )

END and DEAD———-

0 0
原创粉丝点击