Codility Lesson 3 MinAvgTwoSlice解答

*大多数朋友如果找到这篇文章,就是来看解答的,所以完整的题目放到文章的最后了。


思路:

1、首先根据题目,大家第一反应就是无脑嵌套遍历所有情况,这样的时间复杂度是O(n^2+n)/2,远远超出O(n)的题目里的要求。

2、其次就是找规律了,这个slice一定发生在最小值周围吗?不一定!比如[-1, -1, 12, -9, 10]。所以不用去思考先找到最小值,再向两边递归的思路了。

3、其实,这里有一个数学证明,就是对于这个最小avg的slice(n,m),m-n+1一定是2或者3,也就是这个最小avg的slice由2个或者3个元素组成。

4、说说为什么会想到上面这个思路:因为题目中说明0<=n<m<N,因此可以得出2个或者3个元素是最小的组合,比如length=3的数组,你无法一次分出2个slice,length=2的数组也一样。为什么要这么去想呢?因为你要“比较”出最小的avg,怎么才能“比较”?那就是必须一次至少有2个slice才能相互比较。那么当N>=4时,我们就能一次最少分出2个slice。举length=4的例子,情况有以下几种:slice(0,1) slice(1,2) slice(2,3) slice(0,2) slice(1,3) slice(0,3)。可以看出前3个是2个元素的slice,后4-6个是3个元素的slice,最后一个是4个元素的slice。再来回想以下我们的命题,就是“min avg一定存在2/3个元素的slice中”,那么反过来就是length>=4的sli

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值