编程之美--只考加法的面试题

看见题目的第一反应是DP,可以使用之前的值来计算,递推公式如下:f(n) = f(n-i)+i

再增加适当的剪枝即可实现,但是对于64位的整数,肯定没有足够的存储空间,放弃。

 

考虑之后对公式进行了推导:

 

num = Σi(bg<=i<=end)=(bg+end)(end-bg+1)/2

 

上式中的bg和end分别为求和公式中起始的位置和结束的位置,均为闭区间。

令sub = end-bg+1,add = bg+end

则上述等式转换为num=sub*add/2,原命题也就转换为求解合适的区间问题。

得到了这个公式之后,再进行求解就会容易很多。

 

再考虑到sub不能大于add等信息,可以用来剪枝,最后的N^2复杂度的代码如下:

 

改程序在小数据的测试下正确,对于大数据没有测试。

 

因为算法本身还是存在缺陷,使用N^2的算法当N很大的时候是非常慢的,这个问题如何解决呢?

其实看过输出的结果之后就会有具体的思路了:

按照把整数分为n个数相加的情况,对n进行遍历,但是这里仍然需要对n的范围进行求和,这里可以使用求和公式求解,因此该算法是O(N)的。

新的算法如下:

 

新的算法在小数据下测试正确,如果有问题,欢迎提出讨论。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值