【算法系列之四】柱狀圖儲水

題目:

給定一個數組,每個位置的值代表一個高度,那么整個數組可以看做是一個直方圖,

如果把這個直方圖當作容器的話,求這個容器能裝多少水

例如:3,1,2,4

代表第一個位置高度為3,第二個位置高度為1,以此類推,這個直方圖能裝3格水。如圖紅色地方:

柱狀圖儲水問題

思路:很多人會誤想到正出什么波峰波谷,這就從開始就錯了,比如兩個相鄰的波峰之外還有更大的波峰,這么說來你中間這連個波峰波谷算的值多白算了,這個用直接點的想法來做就可以了,就找當前i位置上能裝多少水,就是從i位置向前和后遍歷,找到前后max值較小的減去當前i位置的值就是能裝的水,當然要是前或后沒找到i位置小的,那么就不能裝水(給你5分鐘畫圖理解下這個思想)。思路有了,考慮解法:

1、暴力解法,每個i位置,都前后遍歷,這個方法的時間復雜度為O(n2),

public static int getWater(int[] arr) {if (arr == null || arr.length < 3) {return 0;}int sum = 0;for (int i = 1; i < arr.length - 1; i++) {int leftMax = arr[0];for (int j = 0; j < i; j++) {if (arr[j] > leftMax) {leftMax = arr[j];}}int rightMax = arr[arr.length - 1];for (int k = arr.length - 1; k > i; k--) {if (arr[k] > rightMax) {rightMax = arr[k];}}sum += Math.max(0, Math.min(leftMax, rightMax) - arr[i]);}return sum;}

2,空間換時間,預處理數組,在找i之前,定義一個0-i位置最大大值數組,做法就是右滑數組,再定義一個i-length-1的最大是數組,做法就是左滑數組,然后找i上能裝的水時,不用前后找,只需要查表就可以,這個時間復雜度為O(n),空間復雜度為O(n)。

3、時間復雜度為O(n),空間復雜度為O(1),厲害了這個,想不想聽,想不想學,定義一個左指針,指向第二個元素,一個有指針,指向倒數第二個元素,因為一個和最后一個肯定不能儲水,設置左邊最大值為arr[0],右邊最大值為arr[arr.length-1],只需要判斷左邊最大值與右邊最大值即可,當左邊最大值小于右邊最大值,左指針右滑,左指針位置上能裝的水就是左邊對大值減去左指針指的值,若左指針指向的值大于左邊大值,就不減,說明不能儲水,更新左邊最大值,當右邊最大值小于左邊最大值時,右指針左滑,做法跟前類似,直到左指針小于等于有指針跳出循環。反正就一句話,哪邊小那邊指針移動:

public static int getWater(int[] arr) {if (arr == null || arr.length < 3) {return 0;}int value = 0;int leftMax = arr[0];int rightMax = arr[arr.length - 1];int l = 1;int r = arr.length - 2;while (l <= r) {if (leftMax <= rightMax) {value += Math.max(0, leftMax - arr[l]);leftMax = Math.max(leftMax, arr[l++]);} else {value += Math.max(0, rightMax - arr[r]);rightMax = Math.max(rightMax, arr[r--]);}}return value;}

相同思想的另一種寫法

public static int getWater(int[] height) {int res = 0;int l = 0, r = height.length - 1, level = 0;while (l < r) {int lower = height[height[l] < height[r] ? l++ : r--];level = Math.max(level, lower);res += level - lower;}return res;}

?

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

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

相關文章

鹽城大數據產業園人才公寓_岳西大數據產業園規劃設計暨建筑設計方案公布,搶先一睹效果圖...

近日&#xff0c;岳西縣大數據產業園規劃設計暨建筑設計方案公布。岳西縣大數據產業園項目總占地面積17014.10㎡(約合25.52畝)&#xff0c;擬建總建筑面積約為61590.84㎡(地上建筑面積39907.49㎡&#xff0c;地下建筑面積21602.35㎡)。以“科技圓環”為主題&#xff0c;組建出一…

【算法系列之五】對稱二叉樹

給定一個二叉樹&#xff0c;檢查它是否是鏡像對稱的。 例如&#xff0c;二叉樹 [1,2,2,3,4,4,3] 是對稱的。 1/ \2 2/ \ / \ 3 4 4 3但是下面這個 [1,2,2,null,3,null,3] 則不是鏡像對稱的: 1/ \2 2\ \3 3 說明: 如果你可以運用遞歸和迭代兩種方法解決這個問題&a…

【算法系列之六】兩整數之和

不使用運算符 和 - &#xff0c;計算兩整數 a 、b 之和。 示例 1: 輸入: a 1, b 2 輸出: 3示例 2: 輸入: a -2, b 3 輸出: 1 方法一&#xff1a;遞歸 public static int getSum1(int a, int b) {if ((a & b) ! 0) { // 判斷是否有進位return getSum1(a ^ b, (a &…

cuda默認函數與c++沖突_好程序員Python教程系列-第8講:函數和模塊

好程序員Python教程系列-第8講&#xff1a;函數和模塊&#xff0c;在講解本章節的內容之前&#xff0c;我們先來研究一道數學題&#xff0c;請說出下面的方程有多少組正整數解。事實上&#xff0c;上面的問題等同于將8個蘋果分成四組每組至少一個蘋果有多少種方案&#xff0c;所…

【算法系列之七】合并兩個有序鏈表

將兩個有序鏈表合并為一個新的有序鏈表并返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。 示例&#xff1a; 輸入&#xff1a;1->2->4, 1->3->4 輸出&#xff1a;1->1->2->3->4->4/*** Definition for singly-linked list.* public cla…

mfc讓圖片與按鈕一起_對許多張圖片進行批量裁剪,看看我是如何快速做到的

概要&#xff1a;當我們需要對很多圖片進行批量裁剪時&#xff0c;以往的辦法是自己一張一張圖片去操作&#xff0c;非常麻煩。有沒有這樣一個工具&#xff0c;能夠幫我們批量進行處理呢&#xff1f;之前小編在網上找了非常多的軟件&#xff0c;一個一個地安裝試用&#xff0c;…

【算法系列之八】刪除鏈表的倒數第N個節點

給定一個鏈表&#xff0c;刪除鏈表的倒數第 n 個節點&#xff0c;并且返回鏈表的頭結點。 示例&#xff1a; 給定一個鏈表: 1->2->3->4->5, 和 n 2.當刪除了倒數第二個節點后&#xff0c;鏈表變為 1->2->3->5.說明&#xff1a; 給定的 n 保證是有效的…

手寫分頁sql_分頁查詢SQL語句

表結構&#xff1a;DROP TABLE IF EXISTS zhoufoxcn.userlist;CREATE TABLE zhoufoxcn.userlist (UserId int(10) unsigned NOT NULL auto_increment,UserName varchar(45) NOT NULL,Age int(10) unsigned NOT NULL default 10,Sex tinyint(3) unsigned NOT NULL default 1,Ta…

【算法系列之九】合并兩個有序數組

給定兩個有序整數數組 nums1 和 nums2&#xff0c;將 nums2 合并到 nums1 中&#xff0c;使得 num1 成為一個有序數組。 說明: 初始化 nums1 和 nums2 的元素數量分別為 m 和 n。你可以假設 nums1 有足夠的空間&#xff08;空間大小大于或等于 m n&#xff09;來保存 nums2 …

把網卡指定給vm虛擬機_為VMWare虛擬網卡指定靜態的MAC地址

當你把虛擬機移到另一臺主機或在同一臺主機但不同的路徑時&#xff0c;虛擬機的MAC地址將會更改。默認情況下VMWare會保證MAC地址的唯一性卻不保存固定性&#xff0c;在每次開啟虛擬機里的系統時都可能重新分配MAC地址來保證唯一性&#xff0c;若你想保證即使虛擬機被移動后&am…

【算法系列之十】三數之和

給定一個包含 n 個整數的數組 nums&#xff0c;判斷 nums 中是否存在三個元素 a&#xff0c;b&#xff0c;c &#xff0c;使得 a b c 0 &#xff1f;找出所有滿足條件且不重復的三元組。 注意&#xff1a;答案中不可以包含重復的三元組。 例如, 給定數組 nums [-1, 0, 1,…

android 動態獲取全縣_省市縣 ------ 三級滾動(android)

預先加載仿滾輪實現的全部數據mCityPickerView.init(this);③ 點擊響應&#xff1a;ss.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {CityConfig cityConfig new CityConfig.Builder().title("選擇城市")//標題.build();m…

發電廠電氣部分第三版pdf_火力發電廠電氣主接線的特點

根據火力發電廠的容量及其在電力系統中的地位&#xff0c;一般可將火力發電廠分為區域性火力發電廠和地方性火力發電廠。這兩類火力發電廠的電氣主接線有各自的特點。一、區域性火力發電廠的電氣主接線1、單機容量及總裝機容量都較大單機容量多為300MW、600MW和少量1000MW,電廠…

【算法系列之十一】k個一組翻轉鏈表

給出一個鏈表&#xff0c;每 k 個節點一組進行翻轉&#xff0c;并返回翻轉后的鏈表。 k 是一個正整數&#xff0c;它的值小于或等于鏈表的長度。如果節點總數不是 k 的整數倍&#xff0c;那么將最后剩余節點保持原有順序。 示例 : 給定這個鏈表&#xff1a;1->2->3-&g…

ghostblog主題_讀Ghost博客源碼與自定義Ghost博客主題

我使用的Ghost博客一直使用者默認的Casper主題。我向來沒怎么打理過自己博客&#xff0c;一方面認為自己不夠專業&#xff0c;很難寫出質量比較高的文字&#xff1b;另一方面認為博客太耗時間&#xff0c;很容易影響正常的工作內容。最近公司即將搬遷&#xff0c;我的開發工作也…

【算法系列之十二】最接近的三數之和

給定一個包括 n 個整數的數組 nums 和 一個目標值 target。找出 nums 中的三個整數&#xff0c;使得它們的和與 target 最接近。返回這三個數的和。假定每組輸入只存在唯一答案。 例如&#xff0c;給定數組 nums [-1&#xff0c;2&#xff0c;1&#xff0c;-4], 和 target 1…

定義一個dto對象_業務代碼的救星——Java 對象轉換框架 MapStruct 妙用

在業務項目的開發中&#xff0c;我們經常需要將 Java 對象進行轉換&#xff0c;比如從將外部微服務得到的對象轉換為本域的業務對象 domainobject&#xff0c;將 domainobject 轉為數據持久層的 dataobject&#xff0c;將 domainobject 轉換為 DTO 以便返回給外部調用方等。在轉…

JVM調優總結 -Xms -Xmx -Xmn -Xss

堆大小設置 JVM 中最大堆大小有三方面限制&#xff1a;相關操作系統的數據模型&#xff08;32-bt還是64-bit&#xff09;限制&#xff1b;系統的可用虛擬內存限制&#xff1b;系統的可用物理內存限制。32位系統 下&#xff0c;一般限制在1.5G~2G&#xff1b;64為操作系統對內存…

discuz設置用戶每天回帖數_[建站教程]Discuz3.4設置QQ互聯登陸教程

雖然現在很多人已經不在使用QQ了&#xff0c;但瘦死的駱駝比馬大&#xff0c;QQ的用戶基數還是很大&#xff0c;而且QQ里有大量的年輕用戶&#xff0c;像我的表妹&#xff0c;表弟剛上初中。他們是忠誠的QQ用戶。為了獲取這批年輕的用戶&#xff0c;我們還是有必要讓網站支持QQ…

五種線程池的對比與使用

今天對五種常見的java內置線程池進行講解。 線程使用的demo public static void cache() {ExecutorService pool Executors.newCachedThreadPool();long start System.currentTimeMillis();pool.execute(() -> {int sum 0;for (int i 0; i < 10; i) {sum (int) Ma…