日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/7/5 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 2086. 从房屋收集雨水需要的最少水桶数(贪心) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 題目
    • 2. 解題

1. 題目

給你一個下標從 0 開始的字符串 street 。street 中每個字符要么是表示房屋的 ‘H’ ,要么是表示空位的 ‘.’ 。

你可以在 空位 放置水桶,從相鄰的房屋收集雨水。
位置在 i - 1 或者 i + 1 的水桶可以收集位置為 i 處房屋的雨水。
一個水桶如果相鄰兩個位置都有房屋,那么它可以收集 兩個 房屋的雨水。

在確保 每個 房屋旁邊都 至少 有一個水桶的前提下,請你返回需要的 最少 水桶數。
如果無解請返回 -1 。

示例 1: 輸入:street = "H..H" 輸出:2 解釋: 我們可以在下標為 12 處放水桶。 "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' ,要么是 '.' 。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/minimum-number-of-buckets-required-to-collect-rainwater-from-houses
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

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++


我的CSDN博客地址 https://michael.blog.csdn.net/

長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!

總結

以上是生活随笔為你收集整理的LeetCode 2086. 从房屋收集雨水需要的最少水桶数(贪心)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。