列表

详情


BM95. 分糖果问题

描述

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

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

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

要求: 时间复杂度为 空间复杂度为

数据范围:

示例1

输入:

[1,1,2]

输出:

4

说明:

最优分配方案为1,1,2

示例2

输入:

[1,1,1]

输出:

3

说明:

最优分配方案是1,1,1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 12ms, 内存消耗: 2756KB, 提交时间: 2021-09-18

class Solution {
public:
    /**
     * pick candy
     * @param arr int整型vector the array
     * @return int整型
     */
    int candy(vector<int>& arr) {
        // write code here
        if(arr.size()==1)
            return 1;
        if(arr.size()==0)
            return 0;
        vector<int> count(arr.size(),1);
        for(int i=1;i<arr.size();i++){
            if(arr[i]>arr[i-1]){
                count[i] = count[i-1]+1;
            }
            
        }
        for(int i=arr.size()-1;i>0;i--){
            if(arr[i]<arr[i-1]){
                count[i-1] = max(count[i]+1,count[i-1]);
            }
        }
        int res = 0;
        for(int i=0;i<count.size();i++){
            res += count[i];
        }
        return res;
    }
};

C++ 解法, 执行用时: 12ms, 内存消耗: 2824KB, 提交时间: 2022-05-11

static const auto io_sync_off = [](){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    return nullptr;
}();
class Solution {
public:
    /**
     * pick candy
     * @param arr int整型vector the array
     * @return int整型
     */
    int candy(vector<int>& arr) {
        // write code here
        if(arr.size() <= 1) return arr.size();
        
        int len = arr.size();
        vector<int> nums(len, 1);
    
        for(int i=1; i < len; i++){
            if(arr[i-1] < arr[i]){
                nums[i] = nums[i-1] + 1;
            }
        }
        int res = 0;
        for(int i=len-1; i > 0; i--){
            if(arr[i-1] > arr[i] && nums[i-1] <= nums[i]){
                nums[i-1] = nums[i] + 1;
            }
            res += nums[i];
        }
        res += nums[0];
        return res;
    }
};

C++ 解法, 执行用时: 12ms, 内存消耗: 2828KB, 提交时间: 2022-07-25

static const auto io_sync_off = [](){
   std::ios::sync_with_stdio(false);;
    cin.tie(nullptr);
    return nullptr;
}();

class Solution {
public:
    /**
     * pick candy
     * @param arr int整型vector the array
     * @return int整型
     */
    int candy(vector<int>& arr) {
        // write code here
        vector<int>nums(arr.size(),1);
        for(int i = 1; i < arr.size(); i++){
            if(arr[i] > arr[i-1])
                nums[i] = nums[i-1] + 1;
        }
        int res = nums[arr.size()-1];
        for(int i = arr.size() -2; i >= 0; i--){
            if(arr[i] > arr[i+1] && nums[i] <= nums[i+1])
                nums[i] = nums[i+1] +1;
            res += nums[i];
        }
        return res;
    }
};

C++ 解法, 执行用时: 12ms, 内存消耗: 2828KB, 提交时间: 2022-06-20

static const auto io_sync_off = [](){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    return nullptr;
}();
class Solution {
public:
    /**
     * pick candy
     * @param arr int整型vector the array
     * @return int整型
     */
    int candy(vector<int>& arr) {
        int l=arr.size();
        vector<int>dp(l,1);
        int mincandy=0;
        for(int i=1;i<l;i++){
            if(arr[i]>arr[i-1])
                dp[i]=dp[i-1]+1;
        }
        for(int i=l-2;i>=0;i--){
            if(arr[i]>arr[i+1] && dp[i]<=dp[i+1])
                dp[i]=dp[i+1]+1;
        }
        for(int i=0;i<l;i++){
            mincandy+=dp[i];
        }
        return mincandy;
    }
};

C++ 解法, 执行用时: 12ms, 内存消耗: 2848KB, 提交时间: 2021-09-12

class Solution {
public:
    /**
     * pick candy
     * @param arr int整型vector the array
     * @return int整型
     */
    int candy(vector<int>& arr) {
        // write code here
        if (arr.empty()) return 0;
        vector<int> left(arr.size(), 1);
        vector<int> right(arr.size(), 1);
        for (int i = 1; i < left.size(); i++) {
            if (arr[i] > arr[i-1]) left[i] = left[i-1]+1;
        }
        int res = left[left.size()-1];
        for (int i = right.size()-2; i >= 0; i--) {
            if (arr[i] > arr[i+1]) right[i] = right[i+1]+1;
            res += max(left[i], right[i]);
        }
        return res;
    }
};

上一题