求陣列給定的容器的蓄水量

2022-08-19 16:39:11 字數 1293 閱讀 6429

給定乙個非負數的陣列,代表乙個容器。例如陣列[0,1,0,2,1,0,1,3,2,1,2,1],就是 以下圖形中黑色的部分。如果用這個容器接水的話,請問可以接多少水?還以這個陣列為例,可以接6格水,就是以下圖形中藍色的部分。

要求:實現時間複雜度o(n),額外空間複雜度o(1)的解法。

首先看一下簡單的演算法

解法一:使用輔助陣列

原理:假設我要求第i個位置處的水的值,則我應該找到i左邊的最大值和i右邊的最大值,使用兩個陣列

l和r來表示。其中l[i]表示i前面的最大值,r[i]表示後面的最大值。然後使用兩個最大值中的較小的值去減去i的值,如果i的值小於等於0,則積蓄的水為0,否則就是相減後的值。由於遍歷求每個i是從左到右的,每次i左邊的最大值只需要乙個值來儲存。

時間複雜度:o(n),空間複雜度:o(n)

public

static

intmaxwater

(int

arr)

max =0

;//用來計算總的水量

for

(inti =

1;i <

arr.

length -1

;i++)

return

max;

}

解法二:使用四個變數

5 4 … 3 7

| |

從左右兩邊向中間遍歷,首先設定左右兩邊的最大值為陣列第乙個和最後乙個數,當左邊的值小於右邊的值,左邊值小於右邊值, 則說明左邊的值已經可以計算左邊的下乙個值(這是左邊的值已經小於右邊的值,因為水量是根據左右最大值的小值確定的,左邊的i左邊的最大值是確定了,且是小於左右的值,說明計算i時,是使用左邊的最大值計算的,因此此時可以計算左邊的下乙個值),同理當右邊最大值小於左邊最大值時,可以計算右邊的上乙個值。

實現時間複雜度o(n),空間複雜度o(1)。

實現:public

static

intmaxwaterwithconstspace

(int

arr)

else

}

return

max;

}

來自為知筆記(wiz)

給定乙個陣列,根據陣列名求陣列的長度

題目 給定乙個陣列名字,如何根據陣列名求陣列的長度?本題來自於乙個同學筆試題,筆試中是實現乙個氣泡排序,但是排序的引數只有乙個陣列名,沒有陣列中元素的個數 void bubblesort int a 思路 要先實現這個氣泡排序,首先要獲取這個陣列中陣列元素的個數。然後對陣列排序,下面說一下如何根據陣...

求陣列的長度

在計算陣列所有元素之和等等問題時,經常需要知道某乙個陣列的長度,其求解公式如下 int data int size sizeof data sizeof data 0 size就是陣列data的長度。陣列作為實參和形參時,長度不同的原因 include stdafx.h int add int a,...

求陣列的逆序數

題目 在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。現在,給你乙個n個元素的序列,請你判斷出它的逆序數是多少。比如 1 3 2 的逆序數就是1。方法1 o n 2 這個就不說了。方法2 借助歸併排序達到o...