我正在做關於編碼的練習。我在這個問題上花了兩天的時間,而且我的分數沒有提高。我的正確性得分爲100%,但因爲它返回了錯誤的答案(不是因爲時間或空間的複雜性)而失敗了一些性能測試。我的錯誤結果總是比預期的答案少。任何人都可以想到我需要添加一塊我缺少的石頭的情況嗎?曼哈頓天際線覆蓋失敗一些測試案例
這是提示:
你要建立一個石牆。牆壁應該是直的,長度爲N米,並且其厚度應該是恆定的;但是,它應該在不同的地方有不同的高度。牆的高度由零指數陣列
H
的N
正整數指定。
H[I]
是牆壁從I
到I+1
到其左端右側的高度。特別是,H[0]
是牆壁左端的高度,H[N−1]
是牆壁右端的高度。牆體應該由立方體石塊(即這些塊的所有邊都是矩形)構成。您的任務是計算構建牆的最小塊數。
編寫一個函數,給定一個零索引的數組
H
N
指定牆的高度的正整數返回構建它所需的最小塊數。class Solution { public int solution(int[] H); }
例如,給定陣列
H
含有N = 9
整數:H[0] = 8 H[1] = 8 H[2] = 5 H[3] = 7 H[4] = 9 H[5] = 8 H[6] = 7 H[7] = 4 H[8] = 8
該函數應返回7.該圖顯示了七個塊一種可能的佈置。
假設:
N
在該範圍內[1..100,000]
的整數;- 數組
H
的每個元素是[1..1,000,000,000]
範圍內的整數。複雜性:
- 預期最壞情況下的時間複雜度是\ $ O(N)\ $;
- 預期最壞情況下的空間複雜度爲\ $ O(N)\ $,超出輸入存儲空間(不包括輸入參數所需的存儲空間)。
- 輸入數組的元素可以修改。
這是我的解決方案:
import java.util.*;
class Solution {
public int solution(int[] H) {
// write your code in Java SE 8
LinkedList<Integer> stack = new LinkedList<Integer>();
int count = 1;
int lowest = H[0];
stack.push(H[0]);
if(H.length == 1){
return 1;
}
else{
for(int i = 1; i<H.length; i++){
if(H[i] > H[i-1]){
stack.push(H[i]);
count++;
}
if(H[i] < lowest){
while(stack.size() > 0){
stack.pop();
}
stack.push(H[i]);
lowest = H[i];
count++;
}
if(H[i] < H[i-1] && H[i] > lowest){
while(stack.size() > 0 && stack.peek() > H[i]){
stack.pop();
}
if(stack.size() > 0 && stack.peek() < H[i]){
stack.push(H[i]);
count++;
}
}
}
}
return count;
}
}
我沒有打擾閱讀的問題,而是這部分看起來令人擔憂,以我爲'(INT I = 1 ; i
gerrytan
2014-10-07 04:16:10
我確定。 H [i]與H [i-1]進行比較。 H [0]用於初始化上面的一些事情。 – user137717 2014-10-07 04:18:12