LeetCode 2086. 从房屋收集雨水需要的最少水桶数(贪心)

简介: LeetCode 2086. 从房屋收集雨水需要的最少水桶数(贪心)

文章目录


1. 题目

2. 解题


1. 题目


给你一个下标从 0 开始的字符串 street 。street 中每个字符要么是表示房屋的 ‘H’ ,要么是表示空位的 ‘.’ 。


你可以在 空位 放置水桶,从相邻的房屋收集雨水。

位置在 i - 1 或者 i + 1 的水桶可以收集位置为 i 处房屋的雨水。

一个水桶如果相邻两个位置都有房屋,那么它可以收集 两个 房屋的雨水。


在确保 每个 房屋旁边都 至少 有一个水桶的前提下,请你返回需要的 最少 水桶数。

如果无解请返回 -1 。

示例 1:
输入:street = "H..H"
输出:2
解释:
我们可以在下标为 1 和 2 处放水桶。
"H..H" -> "HBBH"('B' 表示放置水桶)。
下标为 0 处的房屋右边有水桶,下标为 3 处的房屋左边有水桶。
所以每个房屋旁边都至少有一个水桶收集雨水。
示例 2:
输入:street = ".H.H."
输出:1
解释:
我们可以在下标为 2 处放置一个水桶。
".H.H." -> ".HBH."('B' 表示放置水桶)。
下标为 1 处的房屋右边有水桶,下标为 3 处的房屋左边有水桶。
所以每个房屋旁边都至少有一个水桶收集雨水。
示例 3:
输入:street = ".HHH."
输出:-1
解释:
没有空位可以放置水桶收集下标为 2 处的雨水。
所以没有办法收集所有房屋的雨水。
示例 4:
输入:street = "H"
输出:-1
解释:
没有空位放置水桶。
所以没有办法收集所有房屋的雨水。
示例 5:
输入:street = "."
输出:0
解释:
没有房屋需要收集雨水。
所以需要 0 个水桶。
提示:
1 <= street.length <= 10^5
street[i] 要么是 'H' ,要么是 '.' 。



2. 解题


  • 不是最优解,也是贪心的思路
  • 先把. 左右都有的位置放上,然后再处理单个的
class Solution {
public:
    int minimumBuckets(string street) {
        int n = street.size();
        vector<int> ct(n, 0); // 记录 . 左右有没有满足条件的 H 的数量
        for(int i = 0; i < n; ++i)
        {
            if(street[i]=='H')
            {
                if(i-1>=0 && street[i-1]=='.')
                    ct[i-1]++;
                if(i+1<n && street[i+1]=='.')
                    ct[i+1]++;
            }
        }
        vector<bool> have(n, false);
        int ans = 0;
        for(int i = 0; i < n; ++i)
        {
            if(ct[i] == 2) // 先处理2个的情况
            {
                have[i-1] = have[i+1] = true;
                if(i-2>=0 && street[i-2]=='.')
                    ct[i-2]--;
                if(i+2<n && street[i+2]=='.')
                    ct[i+2]--;
                ct[i] = 0;
                ans++;
            }
        }
        for(int i = 0; i < n; ++i)
        {
            if(ct[i] == 1)
            {
                ans++;
                if(i-1>=0 && street[i-1]=='H') 
                {
                    have[i-1]=true;
                }
                if(i+1<n && street[i+1]=='H') 
                {
                    have[i+1]=true;
                    if(i+2<n && street[i+2]=='.')
                        ct[i+2]--;//记得更新后面的计数
                }
            }
        }
        for(int i = 0; i < n; ++i)
        {
            if(street[i]=='H' && have[i]==false) return -1;
        }
        return ans;
    }
};

28 ms 14.1 MB C++

相关文章
|
7月前
|
算法 测试技术 C#
【图论】【分类讨论】LeetCode3017按距离统计房屋对数目
【图论】【分类讨论】LeetCode3017按距离统计房屋对数目
LeetCode 剑指 Offer II 089. 房屋偷盗
一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响小偷偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
59 0
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
62 6
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
55 4
|
4月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
124 2
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
43 1
|
3月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
4月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
72 7
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
54 5