題目:柱狀圖中最大的矩形
給定 n 個非負整數,用來表示柱狀圖中各個柱子的高度。每個柱子彼此相鄰,且寬度為 1 。
求在該柱狀圖中,能夠勾勒出來的矩形的最大面積。
以上是柱狀圖的示例,其中每個柱子的寬度為 1,給定的高度為 [2,1,5,6,2,3]。
圖中陰影部分為所能勾勒出的最大矩形面積,其面積為 10 個單位。
示例:輸入: [2,1,5,6,2,3]
輸出: 10
答案:1.暴力法
對每個子區間進行最大矩形面積求解,更新最大面積
class
solution
}return maxarea;
}}
時間複雜度:o(n2)。 需要列舉所有可能的柱子對。
空間複雜度:o(1) 。不需要額外的空間。
class
solution
public
intcalculatearea
(int
heights,
int start,
int end)
}
時間複雜度:
平均開銷:o(nlogn)
最壞情況:o(n2)。如果陣列中的數字是有序的,分治演算法將沒有任何優化效果。
空間複雜度:o(n)。最壞情況下遞迴需要 o(n) 的空間。
3.單調棧(想法很重要)
我們維護乙個棧。一開始,我們把 -1 放進棧的頂部來表示開始。初始化時,按照從左到右的順序,我們不斷將柱子的序號放進棧中,直到遇到相鄰柱子呈下降關係,也就是 a[i-1] > a[i] 。將棧中的序號彈出,直到遇到 stack[j] 滿足a[stack[j]]≤a[i](保持單調遞增的關係)。每次彈出stack[top] 時,記當前元素在原陣列中的下標為 i ,當前彈出元素為高的最大矩形面積為:
(i−stack[top−1]−1)×a[stack[top]].
public
class
solution
while
(stack.
peek()
!=-1)
maxarea = math.
max(maxarea, heights[stack.
pop()]
*(heights.length - stack.
peek()
-1))
;return maxarea;
}}
時間複雜度:o(n)。 n 個數字每個會被壓棧彈棧各一次。
空間複雜度:o(n)。用來存放棧中元素。
Leetcode刷題筆記
1.兩數之和給定乙個整數陣列nums 和乙個目標值target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。ps 你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。思路 用target減去nums中的每乙個數,並設立乙個字典來記錄對應的下標 class...
LeetCode刷題筆記
實現strstr 給定乙個 haystack 字串和乙個 needle 字串,在 haystack 字串中找出 needle 字串出現的第乙個位置 從0開始 如果不存在,則返回 1。示例 1 輸入 haystack hello needle ll 輸出 2 示例 2 輸入 haystack aaaa...
LeetCode刷題筆記
給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 ...