LeetCode刷題筆記 84

2021-10-02 18:37:09 字數 1454 閱讀 8510

題目:柱狀圖中最大的矩形

給定 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 輸出 ...