135. 分发糖果(leetcode)

https://leetcode.cn/problems/candy/description/

贪心,策略是确定一侧的正确性,再确定另一侧的正确性,最后综合作为正确答案,其中先确定一侧的正确性是局部最优,确定两侧的正确性的局部最优,且找不到反例就可以推出全局最优答案

class Solution {
    public int candy(int[] ratings) {
        int[] num=new int[ratings.length];
        Arrays.fill(num,1);

        // 计算右边孩子大于左边孩子的情况
        for(int i=1;i<ratings.length;i++)
            if(ratings[i]>ratings[i-1])
                num[i]=num[i-1]+1;

        // 计算左边孩子大于右边孩子的情况
        for(int i=ratings.length-2;i>=0;i--)
            if(ratings[i]>ratings[i+1])
            {
                // 取左边和右边+1的最大值,作为本值
                // 即只需要比相邻的最大值大1即可
                // 即 : num[i]=Math.max(num[i-1],num[i+1]+1);
                // 但是上面的循环已经计算过了,此时的num[i]一定比左边大,因此只需要让num[i]和num[i+1]+1比较即可
                num[i]=Math.max(num[i],num[i+1] + 1);
            }
            
        int res=0;
        for(int i=0;i<ratings.length;i++)res+=num[i];
        return res;
    }
}

 

posted @   风乐  阅读(2)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示