当前位置: 首页 > news >正文

Leetcode 135 -- 贪心 | 拓扑排序

题目描述

分发糖果

思路

题目要求很简单:如果一个人的评分比它左边的孩子要高,那么分得的糖果要比左边的孩子多。如果评分比它右边的孩子高,那么分得的糖果还要比它右边的孩子多,每个孩子至少一个糖果。

贪心
如果一个孩子的评分比它相邻的孩子多的话,那么分得的糖果只能多一个,这样才能保证分得的糖果最少。
我们可以遍历数组两次,第一次遍历满足每个孩子的糖果比它左边的孩子糖果多(如果评分更高的话)。
第二次遍历就需要满足糖果比它右边的孩子多了(如果评分更高的话),但是这样还需要判断糖果是否本身就比右边的孩子多,如果本来就比你多的话,就不能变!因为增加是不需要的,我本来就比你多。减少也不行,否则糖果可能就少于左边的孩子了。

拓扑排序
将数组看作一个有向图

代码1 贪心

class Solution {
public:
    int candy(vector<int>& w) {
        int n = w.size();
        vector<int> f(n, 1);
        for(int i = 1; i < n; i ++ )
        {
            if(w[i] > w[i - 1]) f[i] = f[i - 1] + 1;
        }
        for(int i = n - 2; i >= 0; i -- )
        {
            if(w[i] > w[i + 1] && f[i] <= f[i + 1]) f[i] = f[i + 1] + 1;
        }
        
        int sum = accumulate(f.begin(), f.end(), 0);
        return sum;
    }
};

代码2 topsort

class Solution {
public:
    int candy(vector<int>& ratings) {
        int n = ratings.size();
        vector<int> indegrees(n, 0);
        for (int i = 0; i < n; ++i) {
            if (i > 0 && ratings[i] > ratings[i - 1]) ++indegrees[i]; //评分大于邻位时,增加入度
            if (i + 1 < n && ratings[i] > ratings[i + 1]) ++indegrees[i];
        }
        queue<int> q;
        for (int i = 0; i < n; ++i) {
            if (indegrees[i] == 0) q.push(i);
        }
        vector<int> candies(n, 0);
        int iter = 1;
        while (!q.empty()) {
            int s = q.size();
            while (s-- > 0) {
                int i = q.front();
                q.pop();
                candies[i] = iter;
                if (i > 0 && ratings[i] < ratings[i - 1]) {
                    --indegrees[i - 1];
                    if (indegrees[i - 1] == 0) q.push(i - 1);
                }
                if (i + 1 < n && ratings[i] < ratings[i + 1]) {
                    --indegrees[i + 1];
                    if (indegrees[i + 1] == 0) q.push(i + 1);
                }
            }
            ++iter;
        }
        return accumulate(candies.begin(), candies.end(), 0);
    }
};
http://www.dtcms.com/a/112637.html

相关文章:

  • 【多线程-第四天-自己模拟SDWebImage的下载图片功能-下载操作管理类 Objective-C语言】
  • 如何排查、定位 SQL 慢查询及其优化策略
  • 16进制在蓝牙传输中的应用
  • 检查 Python 中的可迭代对象是否相等
  • Bethune X 6发布:为小规模数据库环境打造轻量化智能监控巡检利器
  • 字符串-JS
  • 基于 Hough 变换的直线检测2025.4.1
  • 大数据笔试题_第一阶段配套笔试题01
  • 浅谈AI落地 - 文章推荐 - 混合推荐模型
  • 【CF】Day24——Codeforces Round 994 (Div. 2) D
  • 常用性能指标(metrics)
  • 理解OSPF 特殊区域Stub和各类LSA特点
  • leetcode-链表+动规
  • idea如何让打开的文件名tab多行显示
  • Android studio进阶教程之(二)--如何导入高德地图
  • 超便捷语音转文字工具CapsWriter-Offline本地部署与远程使用全流程
  • 如何快速入门物联网单片机开发?
  • windows如何安装wkhtmltoimage 给PHP使用根据HTML生成图片
  • Mysql 中的 binlog、redolog、undolog
  • LayaAir3.3.0-beta.3重磅更新!Spine4.2、2D物理、UI系统、TileMap等全面升级!
  • 青少年编程与数学 02-015 大学数学知识点 09课题、专业相关性分析
  • 洛谷题单3-P5724 【深基4.习5】求极差 最大跨度值 最大值和最小值的差-python-流程图重构
  • css 文字换行每一个字渐变
  • go游戏后端开发25:红中麻将规则介绍
  • Modbus RTU与TCP通信示例
  • Docker 镜像相关的基本操作
  • CCF-CSP认证练习题-第19次-线性分类器
  • 分布式锁算法——基于ZooKeeper的分布式锁全面解析
  • 质检LIMS系统在水产养殖企业的应用 水产养殖企业的现状
  • Jmeter脚本录制