读书笔记之编程之美 - 2.14 求数组的子数组之和的最大值

来源:互联网 发布:微信小程序 php后端 编辑:程序博客网 时间:2024/06/06 02:11

第一次遇到这个题是在Autodesk的笔试题,由于笔试时间比较短,当时只写了个大概思路。

当时我的想法是正负数问题,先从前扫描,把数组的值都加起来,如果某时的sum为负数,则可以丢弃之前的数据,从新开始计算。另外还要从后面进行计算,遇到sum为负数也要进行数据截断。现在看这个解法有个问题,就是数组全为负数的时候,找不到答案,还要补充一步,寻找最大的那个负数。

再看书上的解法,直接看代码清单2-27,nStart = max(A[i], nStart + A[i]),这句的意思就是判断数组后面的结果是否可以被丢弃。如果A[i] > nStart + A[i],也就是nStart < 0,即sum为负数就应该丢弃,从而nStart = A[i]重新开始。而nAll = max(nStart, nAll)则是保证前面的数可以被舍弃。

可以看出我的想法还是正确的,不过书上的解法更简洁。

今天去逛书店,发现这本书2010年5月已经第9次印刷了,书中的插图也更新了不少,但还是有错误,呵呵。比如2.10节的那几张图就不太正确。

原创粉丝点击