🤖
AI审核中

分糖果问题

文章摘要

本文介绍了“分糖果”问题:给定孩子们的得分数组,要求每个孩子至少分到一颗糖,且相邻得分更高的孩子糖数必须更多,返回最少糖果总数。要求时间 O(n)、空间 O(n)。解法采用双向遍历的动态规划:首次从左至右若得分递增则糖数加一;随后从右至左若得分递减且当前糖数不大于右侧,则更新为右侧+1。最终累加所有糖数即为答案。代码实现基于上述思路,时间复杂度线性,空间使用额外数组存储每个孩子的糖数。

题目链接:https://www.nowcoder.com/practice/76039109dd0b47e994c08d8319faa352

题目描述

一群孩子做游戏,现在请你根据游戏得分来发糖果,要求如下:

  1. 每个孩子不管得分多少,起码分到一个糖果。

  2. 任意两个相邻的孩子之间,得分较多的孩子必须拿多一些糖果。(若相同则无此限制)

给定一个数组 arr 代表得分数组,请返回最少需要多少糖果。

要求: 时间复杂度为 O(n) 空间复杂度为 O(n)

数据范围: 1 ≤ n ≤ 100000 ,1 ≤ ai ≤ 1000

示例 1:

输入:   [1,1,2]
返回值: 4
说明:   最优分配方案为1,1,2

示例 2:

输入:   [1,1,1]
返回值: 3
说明:   最优分配方案是1,1,1

解题代码

import java.util.*;

public class Solution {
    /**
     * pick candy
     * @param arr int整型一维数组 the array
     * @return int整型
     */
    public int candy (int[] arr) {
        // write code here
        int N = arr.length;
        if (N == 1) {
            return 1;
        }
        int[] dp = new int[N];
        Arrays.fill(dp, 1);
        for (int i = 1; i < N; i++) {
            if (arr[i - 1] < arr[i]) {
                dp[i] = dp[i - 1] + 1;
            }
        }
        int ans = dp[N - 1];
        for (int i = N - 2; i > -1; i--) {
            if (arr[i] > arr[i + 1] && dp[i] <= dp[i + 1]) {
                dp[i] = dp[i + 1] + 1;
            }
            ans += dp[i];
        }
        return ans;
    }
}

0 条评论

如果你觉得文章对你有帮助,那就请作者喝杯咖啡吧

评论区 0

头像
 0 条评论