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

第一次遇到这个题是在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节的那几张图就不太正确。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值