給定乙個非負數的陣列,代表乙個容器。例如陣列[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...