算法题:一排硬币,每个硬币的面额是随意的正整数,从两端任意取,怎么取到的面额最大(你看了能给别人讲)。
发布日期:2021-05-14 14:12:15 浏览次数:19 分类:精选文章

本文共 579 字,大约阅读时间需要 1 分钟。

题目:

一排硬币,每个硬币的面额是随意的正整数,共有n个,现要求,设计一个算法,从两端取硬币,取a个(a小于n),只能从两端取,问怎么取才能使我们取道的硬币总金额最大。

前言:

这是我在2019年5月去网易校园招聘面试题,当时自己经验不足,没有解决出来这道题,今天有幸在某论坛上得到两位腾讯大神的指点(虽然我没理解他们说的什么意思,可能他们的更加的快、好,我这里只是写一下自己的思路)但是在他们的思路下,我在笔记本上画出了这个解决办法。现在讲给大家。

我的目标:你看了能给别人讲

开始了

首先,假设我们的n是10,a是4,即从10个硬币中取4个。那么大概就是下图所示:

如果我在这里使用穷举法,那我估计会被拉出去打死哈哈哈。我们把自己的注意力放在这个4个上面,然后,如果我们把这一排当成一个圈,会怎么样?类似于下图(相同颜色代表一排硬币中的同一个东西):

这样,我们只需判断,在连续 a(4) 个中 ,开头附近的和最大的了,用图来看(这里我就不用一圈的了,用直线的,容易理解):

这样,很容易得出应该怎么去选择,如果我们用取余来进行这几个下标的循环,我们可以在原数组上计算这个总和,也就是说,理论上:空间复杂度为O(1),时间复杂度为O(a)(但是没这么说的,说O(n)比较正规吧)

结束语:

写完这个教程,感觉当时自己就是糊涂了,竟然想不到这么简单的办法。

上一篇:Go语言安装tensorflow教程(亲测能用,解决 cannot find 包的问题)
下一篇:全文搜索引擎ElasticSearch弹性搜索教程(二)简单插入数据(使用bash脚本语言)

发表评论

最新留言

表示我来过!
[***.240.166.169]2025年04月30日 11时00分16秒