leecode100——接雨水

題目在這里插入圖片描述

雙指針

思路1

使用參數存儲從左往右(從右往左同理)遍歷時的最高的柱子,
然后移動左右的指針,每次移動左右指針中偏向小的,
如果當前指針指的柱子小于最高的柱子,就會存在接到水。

思路2

把水看作柱子,那么整個柱子都會變成凸的樣子,不會出現凹的情況(如果有凹,會被水填滿)
那么我們的參數l_max,r_max就是在記錄凸的地方,和height里的凹的數據進行比較,記錄雨水。

class Solution(object):def trap(self, height):  len_h = len(height)l, r = 0, len_h - 1l_max, r_max = 0, 0ans = 0while l < r:l_max = max(l_max, height[l])r_max = max(r_max, height[r])if height[l] < height[r]:ans += l_max - height[l]l += 1else:ans += r_max - height[r]r -= 1return ans

動態規劃

思路:分別記錄從左到右/從右到左的的最高柱子,思路和雙指針一樣
在這里插入圖片描述

class Solution:def trap(self, height: List[int]) -> int:if not height:return 0n = len(height)leftMax = [height[0]] + [0] * (n - 1)for i in range(1, n):leftMax[i] = max(leftMax[i - 1], height[i])rightMax = [0] * (n - 1) + [height[n - 1]]for i in range(n - 2, -1, -1):rightMax[i] = max(rightMax[i + 1], height[i])ans = sum(min(leftMax[i], rightMax[i]) - height[i] for i in range(n))return ans

前后綴分解

思路:和雙指針思路相似,記錄兩邊的最高柱

class Solution(object):def trap(self, height):""":type height: List[int]:rtype: int"""n = len(height)# pre_max = [0] * n# pre_max[0] = height[0]pre_max = height.copy()for i in range(1, n):pre_max[i] = max(pre_max[i-1], height[i])suf_max = [0] * n  # suf_max[i] 表示從 height[i] 到 height[n-1] 的最大值suf_max[-1] = height[-1]for i in range(n - 2, -1, -1):suf_max[i] = max(suf_max[i + 1], height[i])ans = 0for h, pre, suf in zip(height, pre_max, suf_max):ans += min(pre, suf) - h #累計每個水桶能接多少水return ans 

思路:

  1. 使用棧按單調遞減記錄左邊柱子的情況
  2. 當識別到高于目前棧頂的元素的時候,不斷彈出棧頂的元素(作為坑底),將棧前一個元素作為左邊界,當前元素h作為右邊界,橫著計算水坑。while循環就是不斷地計算橫著的水坑,直到識別到左邊沒有合適的邊界無法形成水坑/左邊的邊界大于當前元素。
  3. 最后將目前的柱子推入棧。

注意 while 中加了等號,這可以讓棧中沒有重復元素,從而在有很多重復元素的情況下,使用更少的空間。

class Solution(object):def trap(self, height):""":type height: List[int]:rtype: int"""ans = 0st = []for i, h in enumerate(height):# 當棧不為空,且當前高度大于棧頂索引對應的高度時while st and height[st[-1]] <= h: bottom_h = height[st.pop()] # 彈出棧頂元素,這個位置將作為"水坑底部"if not st: # 如果棧空了,說明左邊沒有更高的邊界,無法形成水坑break  left = st[-1] # 此時棧頂元素就是左邊界dh = min(height[left], h) - bottom_h # 計算水坑的高度:左右邊界中較低的那個減去底部高度ans += dh * (i - left - 1)# 計算水坑的寬度:當前位置到左邊界的距離減1st.append(i) # 把當前位置加入棧,保持棧的單調遞減特性return ans 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/921637.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/921637.shtml
英文地址,請注明出處:http://en.pswp.cn/news/921637.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

復古膠片風格街拍人像Lr調色教程,手機濾鏡PS+Lightroom預設下載!

調色教程復古膠片風格街拍人像 Lightroom 調色&#xff0c;通過模擬經典膠片相機的色彩科學&#xff0c;為現代數碼照片注入懷舊韻味。這種調色手法注重低飽和度色彩、柔和的高光過渡和豐富的暗部細節&#xff0c;配合適度的顆粒感&#xff0c;營造出時光沉淀的質感。特別適合街…

Linux的gpio子系統

GPIO其實也是某個pin的功能之一。上一小節講解了 pinctrl 子系統&#xff0c;pinctrl 子系統重點是設置 PIN(有的 SOC 叫做 PAD)的復用和電氣屬性&#xff0c;如果 pinctrl 子系統將一個 PIN 復用為 GPIO 的話&#xff0c;那么接下來就要用到 gpio 子系統了。gpio 子系統顧名思…

VC++ CPU指令集檢測工具實現原理

&#x1f4c8; VC CPU指令集檢測工具實現原理 例圖&#xff1a;&#x1f9e0; 1. 核心原理&#xff1a;CPUID指令 // 使用CPUID指令獲取CPU信息 int cpuInfo[4] { -1 }; __cpuid(cpuInfo, 0); // 調用CPUID指令 int nIds cpuInfo[0]; // 獲取最大標準功能號CPUID指令工作流程…

大模型微調理論、實戰:LLaMA-Factory、Unsloth

概述 微調&#xff0c;Fine-Tuning&#xff0c;簡稱FT&#xff0c;可理解為對LLM的定制&#xff0c;目的是增強專業領域知識&#xff0c;并優化特定任務的性能。通過在特定數據集上微調一個預訓練模型&#xff0c;可實現&#xff1a; 更新知識&#xff1a;引入新的領域專屬信…

【LCA 樹上倍增】P9245 [藍橋杯 2023 省 B] 景區導游|普及+

本文涉及知識點 樹上倍增 P9245 [藍橋杯 2023 省 B] 景區導游 題目描述 某景區一共有 NNN 個景點&#xff0c;編號 111 到 NNN。景點之間共有 N?1N-1N?1 條雙向的擺渡車線路相連&#xff0c;形成一棵樹狀結構。在景點之間往返只能通過這些擺渡車進行&#xff0c;需要花費…

基于Python+Streamlit的旅游數據分析與預測系統:從數據可視化到機器學習預測的完整實現

&#x1f3de;? 基于PythonStreamlit的旅游數據分析與預測系統&#xff1a;從數據可視化到機器學習預測的完整實現 &#x1f4dd; 前言 在大數據時代&#xff0c;旅游行業的數據分析變得越來越重要。如何從海量的旅游數據中挖掘有價值的信息&#xff0c;并進行準確的銷量預測&…

飛算JavaAI全鏈路實戰:智能構建高可用電商系統核心架構

飛算JavaAI全鏈路實戰&#xff1a;智能構建高可用電商系統核心架構 前言&#xff1a;AI編程新時代的電商系統開發范式變革 在當今數字經濟時代&#xff0c;電商系統作為企業數字化轉型的核心載體&#xff0c;其復雜度和技術要求與日俱增。一個完整的電商系統不僅需要處理商品、…

論文精讀(五):面向鏈接預測的知識圖譜表示學習方法綜述

筆者鏈接&#xff1a;撲克中的黑桃A 專欄鏈接&#xff1a;論文精讀 本文關鍵詞&#xff1a;知識圖譜; 表示學習; 鏈接預測; 多元關系; 超關系 引 諸位技術同仁&#xff1a; 本系列將系統精讀的方式&#xff0c;深入剖析計算機科學頂級期刊/會議論文&#xff0c;聚焦前沿突破…

Roo Code之自定義指令(Custom Instructions),規則(Rules)

在Roo Code 中&#xff0c;Custom Instructions 可以通過Instructions 設定和Rules 規則文件實現。什么是Custom Instructions&#xff1f; 自定義指令(Custom Instructions)定義了超出Roo基本角色定義范圍的具體行為、偏好和約束。示例包括編碼風格、文檔標準、測試要求和工作…

9/8我是ai大師

一、變量定義部分&#xff08;理解程序的 "記憶"&#xff09;c運行/* USER CODE BEGIN PV */ static uint8_t last_button_state 1; // 初始為高電平&#xff08;未按下&#xff09; static uint8_t device_mode 0; // 設備模式&#xff1a;0LD1, 1LD3, 2蜂鳴器, 3…

前沿重器[74] | 淘寶RecGPT:大模型推薦框架,打破信息繭房

前沿重器欄目主要給大家分享各種大廠、頂會的論文和分享&#xff0c;從中抽取關鍵精華的部分和大家分享&#xff0c;和大家一起把握前沿技術。具體介紹&#xff1a;倉頡專項&#xff1a;飛機大炮我都會&#xff0c;利器心法我還有。&#xff08;算起來&#xff0c;專項啟動已經…

jenkins加docker 部署項目

jenkins加docker 部署springboot項目 1項目結構Dockerfile 內容 FROM openjdk:8-jdk-alpine ARG JAR_FILEtarget/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar","--server.port9090"]在A服務器上啟動jenkins …

提示詞工程(Prompt Engineering)的崛起——為什么“會寫Prompt”成了新技能?

&#x1f380;【開場 貓貓狐狐的對話】&#x1f43e;貓貓扒著屏幕&#xff1a;“喵&#xff1f;咱寫的這句 Prompt 怎么又跑偏啦&#xff1f;明明只是想讓它幫忙寫一段 Python 代碼&#xff0c;它偏要給咱寫論文摘要……” &#x1f98a;狐狐瞇著眼&#xff0c;聲音帶點冷意&a…

供應鏈管理系統入門知識:是什么,功能模塊,怎么定制開發?

如果你是剛接觸企業運營的新手&#xff0c;聽到 “供應鏈管理系統” 可能會覺得有點復雜。其實&#xff0c;它就像一個 “智能管家”&#xff0c;幫企業把從買材料到賣產品的一系列流程管得明明白白。今天就用大白話給你講清楚這個系統到底是什么&#xff0c;以及它能幫上什么忙…

kotlin - 平板分屏,左右拖動,2個Activity計算寬度,使用ActivityOptions、Rect(三)

kotlin - 平板分屏&#xff0c;左右拖動&#xff0c;2個Activity計算寬度&#xff0c;使用ActivityOptions、Rect使用平板&#xff0c;api33才支持&#xff0c;可以左右拖動&#xff0c;分屏第一個頁面 &#xff0c; 思考&#xff1a;分屏后&#xff0c;對整個app的影響&#x…

v0.29.3 敏感詞性能優化之繁簡體轉換 opencc4j 優化

敏感詞性能調優系列 v0.29.0 敏感詞性能優化提升 14 倍全過程 v0.29.1 敏感詞性能優化之內部類迭代器內部類 v0.29.2 敏感詞性能優化之基本類型拆箱、裝箱的進一步優化的嘗試 v0.29.3 敏感詞性能優化之繁簡體轉換 opencc4j 優化 背景 opencc4j opencc4j 中&#xff0c;因…

Spark SQL解析查詢parquet格式Hive表獲取分區字段和查詢條件

首先說一下&#xff0c;這里解決的問題應用場景&#xff1a; sparksql處理Hive表數據時&#xff0c;判斷加載的是否是分區表&#xff0c;以及分區表的字段有哪些&#xff1f;再進一步限制查詢分區表必須指定分區&#xff1f; 這里涉及到兩種情況&#xff1a;select SQL查詢和…

谷歌發布文本嵌入模型EmbeddingGemma(附部署方式)

EmbeddingGemma是谷歌于2025年9月開源的開放式文本嵌入模型&#xff0c;專為端側設備設計&#xff0c;具備以下核心優勢&#xff1a; 性能優勢 在MTEB基準測試中&#xff0c;EmbeddingGemma在500M以下參數規模的多語言文本嵌入模型中表現最佳&#xff0c;性能接近參數翻倍的頂…

CPU調度——調度的目標

2.2.2 調度的目標 當系統中“想運行”的實體多于 CPU 的數量時&#xff0c;調度就不可避免地要在“效率”與“公平”之間做取舍。直觀地說&#xff0c;一類目標希望把硬件壓榨到更高的利用率&#xff0c;讓單位時間內做更多的工作&#xff1b;另一類目標則關心個體體驗&#x…

C++ 8

封裝一個學生的類&#xff0c;定義一個學生這樣類的vector容器, 里面存放學生對象&#xff08;至少3個&#xff09;再把該容器中的對象&#xff0c;保存到文件中。再把這些學生從文件中讀取出來&#xff0c;放入另一個容器中并且遍歷輸出該容器里的學生。#include <iostream…