在 x 軸上有乙個一維的花園。花園長度為 n,從點 0 開始,到點 n 結束。
花園裡總共有 n + 1 個水龍頭,分別位於 [0, 1, …, n] 。
給你乙個整數 n 和乙個長度為 n + 1 的整數陣列 ranges ,其中 ranges[i] (下標從 0 開始)表示:如果開啟點 i 處的水龍頭,可以灌溉的區域為 [i - ranges[i], i + ranges[i]] 。
請你返回可以灌溉整個花園的 最少水龍頭數目 。如果花園始終存在無法灌溉到的地方,請你返回 -1 。
(1)貪心演算法解題思路:
/**
* @author chengqian
* @create 2020-07-07 20:59
* tag-貪心演算法 , leetcode-1326-困難
*/public
static
intmintaps
(int n,
int[
] ranges)
int breakpoint = n, furthest = integer.max_value;
int ans =0;
for(
int i = n; i >
0; i--
) breakpoint = furthest;
ans++;}
}return ans;
}
(2)動態規劃解題思路
/**
* @author chengqian
* @create 2020-07-07 20:59
* tag-動態規劃 , leetcode-1326-困難
*/public
intmintaps
(int n,
int[
] ranges)
int[
] dp =
newint
[n+1];
arrays.
fill
(dp, integer.max_value)
;//dp[i]表示覆蓋花園子區間[0,i],至少選取的區間數目。
dp[0]
=0;for
(int i =
1; i <= n; i++)}
}return dp[n]
== integer.max_value ?-1
: dp[n]
;}
相比較這兩種演算法,雖然貪心演算法和動態規劃可以相互轉換,不難發現貪心演算法效果要優於動態規劃,貪心演算法的時間複雜度為o(n),只遍歷了一次陣列,而動態規劃時間複雜度為o(nr),其中r為陣列ranges中的最大值。
雖然貪心演算法和動態規劃可以相互轉換,不難發現貪心演算法效果要優於動態規劃,貪心演算法的時間複雜度為o(n),只遍歷了一次陣列,而動態規劃時間複雜度為o(nr),其中r為陣列ranges中的最大值。
教主的花園
lhx教主最近總困擾於前來膜拜他的人太多了,所以他給他的花園加上了一道屏障。可以把教主的花園附近區域抽像成乙個正方形網格組成的網路,每個網格都對應了乙個座標 均為整數,有可能為負 若兩個網格 x1,y1 x2,y2 有 x1 x2 y1 y2 1,則說這兩個網格是相鄰的,否則不是相鄰的。教主在y 0...
教主的花園
教主有著乙個環形的花園,他想在花園周圍均勻地種上n棵樹,但是教主花園的土壤很特別,每個位置適合種的樹都不一樣,一些樹可能會因為不適合這個位置的土壤而損失觀賞價值。教主最喜歡33種樹,這3種樹的高度分別為10,20,3010,20,30。教主希望這一圈樹種得有層次感,所以任何乙個位置的樹要比它相鄰的兩...
松雅的花園
問題描述 冬天到了,松雅覺得是時候給她的花園澆水了。她的花園由 n 個連續的苗圃組成,編號從 1 n。其中的 k 個苗圃安裝有水龍頭 第 i 個水龍頭位於苗圃 xi 當水龍頭開啟的時候,可以同時給相鄰的苗圃澆水。1個時間單位後,她可以給苗圃 xi 澆好水,2個時間單位後,她可以給 xi 1,xi 1...