力扣網C語言編程題:接雨水(動態規劃實現)

一. 簡介

本文記錄力扣網上的邏輯編程題,涉及數組方面的,這里記錄一下 C語言實現和Python實現。

二.?力扣網C語言編程題:接雨水

題目:接雨水

給定?n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之后能接多少雨水。

示例 2:
輸入:height = [4,2,0,3,2,5]
輸出:9

提示:
? ? n == height.length
? ? 1 <= n <= 2 * 104
? ? 0 <= height[i] <= 105

初步思路:

暴力解法是最直觀的方法,它直接按照問題的定義來計算每個位置能夠接多少水。

從左到右遍歷數組元素,計算每個柱子的接水量,然后,不斷累加即可。但是問題的關鍵是如何計算每個柱子能接的雨水量?

通過柱型圖觀察可知,只有低洼的位置才會接到雨水。具體意思就是,某個元素 nums[i]的左側與右側所有元素只要高于其本身就可接到雨水。

核心原理:

雨水能被接住的條件是:左右兩側存在比當前位置更高的墻

每個位置能接的雨水量 = min (左側最高墻高度,右側最高墻高度) - 當前墻高度(若結果為負則取 0,其中左側指的是某個元素的左側所有元素值最大的元素)。

解題思路一:(暴力解法)

暴力解法,從左向右邊遍歷數組元素,逐個依次計算每個元素所能接的雨水量,同時不斷累加即可。

遍歷數組,假如計算 nums[i]元素的接雨水量:

首先,計算 nums[i]左邊所有元素中值最大的元素,計算 nums[i]右邊所有元素中值最大的元素。

然后,使用公式計算 nums[i]能接到的雨水量:min(左邊最大元素值,右邊最大元素值)-nums[i];

總結:n個元素都要進行一輪這樣的計算,時間復雜度為O(n*n),空間復雜度為O(1)。這樣時間復雜度太高,超過時間限制,需要進行進一步優化以減少時間復雜度。

解題思路二:(動態規劃)

暴力解法中,每次要計算某個元素的左邊所有元素的最大值和右邊所有元素的最大值。可以用兩個數組,分別統計出來每個元素的左邊中值最大的元素與右邊中值最大的元素(也就是提前統計好),最后,統計所有元素的接水量。

具體方法:

1. 分配兩個數組left_buf,right_buf,分別統計每個元素的左邊中值最大的元素與右邊中值最大的元素;

2. 遍歷數組,統計每個元素左邊所有元素中最大值,并記錄到數組left_buf中(從左向右);

3. 遍歷數組,統計每個元素右邊所有元素中最大值,并記錄到數組right_buf中(從右向右);

4. 計算所有元素的接水量,left_buf數組與 right_buf數組對應比較,求對應位置最小值。使用公式計算每個位置上的接水量:min(left_buf[i], right_buf[i]) - height[i],并不斷累加。

C語言實現如下:

#include <stdio.h>
#include <stdlib.h>//動態規劃
int trap(int *height, int heightSize) {if((height == NULL) || (heightSize < 2)) {return 0;}int i = 0;int receive_water = 0;int* left_max = (int*)calloc(heightSize, sizeof(int));int* right_max = (int*)calloc(heightSize, sizeof(int));//統計所有元素左側的最大值left_max[0] = height[0];for(i = 1; i < heightSize; i++) {left_max[i] = fmax(left_max[i-1], height[i]);}//統計所有元素右側的最大值right_max[heightSize-1] = height[heightSize-1];for(i = heightSize-2; i >=0; i--) {right_max[i] = fmax(right_max[i+1], height[i]);}// 計算接的雨水量for(i = 1; i < (heightSize-1); i++) {receive_water += fmin(left_max[i], right_max[i]) - height[i];}free(left_max);left_max = NULL;free(right_max);right_max = NULL;return receive_water;
}

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

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

相關文章

關于ubuntu環境下vscode進行debug的隨筆

CMakeLists.txt的編寫 頂層目錄的CMakelists.txt 目錄&#xff1a;./CMakeLists.txt #./CMakeLists.txt cmake_minimum_required(VERSION 3.10) project(xxx_project_name LANGUAGES CXX) #設置工程名# 設置 C 標準和編譯選項 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_ST…

技術演進中的開發沉思-9:window編程系列-內核對象線程同步(下)

今天我們繼續走進 Windows 內核的世界&#xff0c;就昨天沒說完的內核對象與線程同步內容接著繼續&#xff0c;它們就像精密儀器里的齒輪&#xff0c;雖不顯眼&#xff0c;卻至關重要。 異步設備 I/O 在 Windows 系統中&#xff0c;異步設備 I/O 就像是一場精心編排的接力賽。…

用AI從0開始量化交易-Anaconda環境(env)和緩存(pkg)更改儲存位置

之前介紹了Anaconda的安裝和環境建立&#xff0c;最近自己的量化交易工具開發的差不多了&#xff0c;卻發生了尷尬的問題&#xff0c;C盤被不斷增大的conda環境和緩存占據得快滿了。 在網上找了些教程&#xff0c;大多是講遷移的&#xff0c;專門講改本地改儲存位置的比較少&am…

Python爬蟲工作基本流程及urllib模塊詳解

在2025年的數據驅動時代&#xff0c;網絡數據成為企業與個人的“金礦”&#xff0c;而Python爬蟲則是挖掘這金礦的“利器”&#xff01;無論是抓取電商價格、分析社交媒體趨勢&#xff0c;還是構建知識庫&#xff0c;Python爬蟲都能讓你事半功倍。然而&#xff0c;爬蟲開發并非…

thinkphp8 模型-一對一,一對多,多對多 學習

thinkphp 命令創建模型&#xff08;和laravel基本一樣&#xff09; php think make:model User 在模型里創建字段 protected $table User; protected $pk id; // 定義返回哪些字段 protected $field [id, name]; // 返回字段的類型 protected $schema [id > int] 模…

非線性方程組求解:復雜情況下的數值方法

在科學研究和工程應用中&#xff0c;非線性方程組的求解是一個常見的挑戰。尤其當方程組包含復雜函數&#xff08;如特殊函數、積分、微分等&#xff09;&#xff0c;使得雅可比矩陣難以解析求導時&#xff0c;傳統的基于解析雅可比矩陣的 Newton-Raphson 方法難以直接應用。本…

邊緣計算網關EG8200Mini首發開箱視頻丨破解工業互聯“協議孤島”,重塑數據價值核心引擎行業痛點直擊|低代碼開發

數據采集4G邊緣計算網關plc 工業現場設備品牌林立&#xff08;西門子、三菱、歐姆龍等30品牌PLC&#xff09;、協議碎片化&#xff08;Modbus/OPC UA/BACnet等&#xff09;、網絡環境復雜&#xff08;戶外無光纖、車間電磁干擾&#xff09;——傳統網關難以實現多源異構設備統一…

2024-2025下期《網絡設備與配置》期末模擬測試

一、 單選題(每題2分&#xff0c;共60分) RIP協議的默認最大跳數是&#xff08; &#xff09; A. 10 B. 15 C. 20 D. 30以下哪個命令可以用來在交換機上進入全局配置模式&#xff1f;&#xff08; &#xff09; A. 使用enable命令 B. 使用configure terminal命令 C. 使用inte…

虹科案例 | 欣旺達如何實現動力電池測試的長期穩定性+自動化?

新能源汽車產業狂飆突進&#xff0c;動力電池測試正面臨前所未有的技術大考。 傳統電池測試方案常因數據丟幀、協議適配等問題&#xff0c;導致測試周期延長和交付延期。在這場關乎安全與效率的產業競速中&#xff0c;高精度數據采集與全球化交付能力&#xff0c;已成為動力電…

第17天:數據庫學習筆記1

數據庫學習筆記 1 SQL語言介紹 2 數據庫的安裝 2.1 啟動數據庫 方式一&#xff1a;net start mysql 方式二&#xff1a;在計算機管理里面手動打開數據庫 2.2 登錄MySQL 方式一&#xff1a;本地登錄 即數據庫與客戶端在同一臺電腦上。 方式二&#xff1a;遠程登錄 mysq…

ChromaDB完全指南:從核心原理到RAG實戰

一、引言:擁抱AI時代的“記憶”變革 在人工智能(AI)浪潮席卷全球的今天,大型語言模型(LLM)以其強大的自然語言處理能力,正在重塑我們與信息的交互方式。然而,LLM并非萬能,它們普遍存在知識截止日期、無法訪問私有數據等“記憶”短板。為了突破這一瓶頸,向量數據庫應…

XCUITest + Swift 詳細示例

??親愛的技術愛好者們,熱烈歡迎來到 Kant2048 的博客!我是 Thomas Kant,很開心能在CSDN上與你們相遇~?? 本博客的精華專欄: 【自動化測試】 【測試經驗】 【人工智能】 【Python】

Spring Boot + MyBatis + Redis Vue3 Docker + Kubernetes + Nginx

前言 前些天發現了一個巨牛的人工智能免費學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站 1.1 畢設項目需求分析&#xff08;附需求文檔片段&#xff09; 一、項目全景與技術選型 1.1 畢設項目需求分析&#xff08;附需…

【云計算領域數學基礎】組合數學優化

一、組合數學優化 1.1、定義與本質特征 1.1.1、組合數學優化的核心原理 ?問題本質與數學工具? ?組合爆炸問題?&#xff1a;軟件輸入參數、路徑組合隨規模指數級增長&#xff0c;如10個二值參數需1024個用例。組合數學通過覆蓋數組&#xff08;Covering Array&#xff09;、…

企業文檔如何變身AI語料庫?無憂文檔NLP+OCR技術實戰解析

當企業爭相采購ChatGPT、文心一言等通用大模型時&#xff0c;卻忽略了&#xff1a;企業文檔其實是這座數字油田的核心資產。從產品手冊、客戶案例到會議紀要&#xff0c;企業沉淀的海量文檔&#xff0c;這些看似零散的信息&#xff0c;其實正通過AI技術被轉化為可復用的“語料庫…

掌握Python編程的核心能力,能快速讀懂并上手項目開發。

掌握Python編程的核心能力&#xff0c;能快速讀懂并上手項目開發。 一套系統且通俗的講解&#xff0c;理論講解 實戰技巧 代碼框架模板&#xff0c;讓你能&#xff1a; 看懂Python項目結構 能自己寫代碼&#xff1a;函數、流程控制、類和模塊 能寫出一個完整、規范的Pytho…

「Linux文件及目錄管理」硬鏈接與軟連接

知識點解析 在Linux系統中,硬鏈接(Hard Link)和軟鏈接(Symbolic Link,又稱軟連接)是兩種不同的文件鏈接方式: 1.硬鏈接(Hard Link): 本質:硬鏈接是文件的一個別名,與原文件共享相同的inode和磁盤數據塊。特點: 數據共享:硬鏈接與原文件指向同一數據塊,修改任…

分清display三個屬性

display 三兄弟行為對比表格 屬性值是否換行能否設置寬高默認寬度常用標簽典型用途block是可以撐滿父容器<div>, <p>, <section>頁面結構、布局容器inline否不行隨內容大小<span>, <a>文字中嵌套、小圖標inline-block否可以隨內容大小<img&g…

《棒球青訓》打造幾個國家級運動基地·棒球1號位

Youth Baseball/Softball Base Development Plan | 青少年棒壘球基地建設方案 Core Strategies | 核心戰略 Regional Hub Construction | 區域樞紐建設 優先在 長三角/珠三角/成渝經濟圈 建設 3大示范性基地 每個基地包含&#xff1a; ?? 國際標準青少年賽場&#xff08;…

JavaScript Symbol 屬性詳解

一、Symbol 的本質與基礎 1. Symbol 是什么 JavaScript 的第七種原始數據類型&#xff08;ES6 引入&#xff09;創建唯一的、不可變的標識符主要用途&#xff1a;作為對象的屬性鍵&#xff08;Symbol 屬性&#xff09; // 創建 Symbol const id Symbol(id); // id 是描述符…