分糖果问题

338 阅读2分钟

这题在力扣或者牛客都能找到,属于贪心算法的内容。

分糖果问题

image.png

在这里我们可以发现,如果arr[i]=arr[i+1],那么两个小孩的糖果一样,如果arr[i]>arr[i+1],那么前面一个小孩的糖果比后面的多,最少是后面的糖果+1,如果arr[i]<arr[i+1],那么后面孩子的糖果比前面多,最少是前面的糖果+1

解法1 两次遍历

贪心思想:需要找到最少糖果,那么相邻位置没有增加情况,大家都是1,有增加的糖果数+1就可以,但是相邻位置有前小后大和后小前大两种情况,所以在第一次添加后,我们还需要从后面遍历异常进行验证。

我们可以另外新建一个糖果数组,通过两次遍历,对糖果数进行修改。最后得到需要的总糖果数。

第一步:new一个糖果数组,初始值全为1,长度和还是数一样。每一个糖果数组对应值,代表当前这个小孩的糖果数。

第二步:从左到右遍历,如果前面孩子的得分大于后面孩子得分,那么前面孩子糖果数=后面孩子糖果数+1

第三步:从右往左遍历,如果前面孩子得分小于后面孩子,并且前面孩子糖果大于后面孩子,那么后面孩子糖果=前面孩子糖果+1.(为什么还需要比较糖果?因为如果前面孩子糖果比后面孩子小,在他们之间已经满足要求,不需要进行糖果修改。)

第四步:遍历糖果数组,获得糖果总数。

代码如下:

image.png

解法2 坡度方法

up表示连续上升个数,down表示连续下降的个数,peek表示当前冯的高度。

如果连续上升了2个,那么糖果数是 1,2,3

此时的peek是第三个数。

如果连续下降两次,那么糖果数是 3,2, 1。

图示如下:

image.png

递增序列每次比前次加一。

递减序列的糖果数取决于递减序列长度与递增序列长度之间的大小关系:

-(1)若递减序列长度decLen小于递增序列长度incLen,则糖果数为1,2,3,……,decLen; -(2)否则在此基础上还需要更新递增序列最后一个元素的值,从incLen更新为decLen。

每次遇到相同的得分,可视为清零重新开始。

代码如下:

image.png