hot100
-
無重復字符的最長字串:
給定一個字符串
s,請你找出其中不含有重復字符的 最長 子串 的長度。- 使用空間換時間:采取set集合去重;
- 重點在于怎么判斷有無重復;
-
尋找兩個正序數組的中位數
給定兩個大小分別為
m和n的正序(從小到大)數組nums1和nums2。請你找出并返回這兩個正序數組的 中位數 。算法的時間復雜度應該為O(log (m+n))- 重點是算法的時間復雜度,這個是用二分查找法;
- 原來是我想多了;
-
正則表達式匹配
給你一個字符串
s和一個字符規律p,請你來實現一個支持'.'和'*'的正則表達式匹配。 -
括號生成
數字
n代表生成括號的對數,請你設計一個函數,用于能夠生成所有可能的并且 有效的 括號組合。- 回溯 + 有效判斷;
-
下一個排列
本題要計算「下一個排列」,這類似于計算「下一個不含重復數字的整數」,計算框架應該和「下一個整數」是類似的,具體要怎么做呢
- 在全排列的基礎上更進一步;
- 思考方向錯了;
-
最長有效括號
-
單詞拆分 + 322. 零錢兌換
給你一個字符串
s和一個字符串列表wordDict作為字典。如果可以利用字典中出現的一個或多個單詞拼接出s則返回true。- 使用回溯法:超時了;
- 動態規劃:
- 線性DP:是由之前狀態推到出;
- 序列DP:需要結合題目尋找前驅狀態:
- 本題這里可以轉化為背包問題;
- 字符串是具有一定放入順序的背包【應該先遍歷背包】;
- 列表則是物體:這里跟物體的順序沒有任何關系【可以放入集合中】;
- 本題這里可以轉化為背包問題;
-
課程表
給你一個有向圖,判斷圖中是否有環。
動態規劃,確定有向無環圖,圖對象結構;
-
入度為0,是起點;
出度為0,是終點; -
一般:深度優先遍歷dfs,判斷是否有換;
-
三個標記,使用boolean 不行:
- 訪問過的標志;
- 正在訪問的標志;
- 沒有訪問的標志;
-
-
打家劫舍 III
小偷又發現了一個新的可行竊的地區。這個地區只有一個入口,我們稱之為
root。- 類似于求樹直徑的直徑,不能回溯,或者遞歸;
拓撲排序:
? 給出一個 有向圖,把這個有向圖轉成線性的排序 就叫拓撲排序。
? 有向無環圖結構;
- 關鍵在于找到入度[出度為0]和出度[入度為0]的節點;
- 圖的方向和圖結構的值【構造對象】
- 對圖節點進行去重 + dfs迭代;;
連續數組之和等于一個定值:
- 連續子數組:窗口內的元素必須滿足”單調性“;
- 前綴和:能夠將連續數組的求和優化為O(1);
? s[i] = s[j] + k; 【i > j】
? s[j] = s[i] - k; =>等效為一個查詢問題HashMap;
-
最短無序連續子數組 :
給你一個整數數組
nums,你需要找出一個 連續子數組 ,如果對這個子數組進行升序排序,那么整個數組都會變為升序排序- 三部分,左,右單調,中間無序;
- 中間的最小 要大于左邊的最大【start從右往左找】;
- 中間的最大:要小于右邊的最小【end 從左往右找】;
-
任務調度器
給你一個用字符數組
tasks表示的 CPU 需要執行的任務列表,用字母 A 到 Z 表示,以及一個冷卻時間n。每個周期或時間間隔允許完成一項任務。任務可以按任何順序完成,但有一個限制:兩個 相同種類 的任務之間必須有長度為n的冷卻時間。返回完成所有任務所需要的 最短時間間隔
-
這就是一個特殊的排序問題。
-
結果就是排序的長度;
-
是找規律,從極端情況下考慮:
-
全為相同任務的時候;
-
全為不同任務的時候;
- :(n + 1) * (max - 1) + count;
-
-
-
字符串解碼
給定一個經過編碼的字符串,返回它解碼后的字符串。
編碼規則為:
k[encoded_string],表示其中方括號內部的encoded_string正好重復k次。注意k保證為正整數。- 一個遞歸問題;
-
戳氣球
有
n個氣球,編號為0到n - 1,每個氣球上都標有一個數字,這些數字存在數組nums中。現在要求你戳破所有的氣球。戳破第
i個氣球,你可以獲得nums[i - 1] * nums[i] * nums[i + 1]枚硬幣。 這里的i - 1和i + 1代表和i相鄰的兩個氣球的序號。如果i - 1或i + 1超出了數組的邊界,那么就當它是一個數字為1的氣球。求所能獲得硬幣的最大數量。
-
本題是一個區間動態規劃的題目;
-
一般是從前往后推到遞推公式,本題是從后往前推到遞推公式
-
遞推公式:dp[i][j]:表示開區間i~j范圍內,能取得最大值;
dp[i][j] = max(dp[i][j], dp[i][k] + dp[k][j] + nums[i] * nums[k] * nums[j])
-
注意:必須獲取區間中任意子區間的dp[i][j] 的值,所以區間長度和左邊界來確定右邊界;
-
-
最長有效括號
給你一個只包含
'('和')'的字符串,找出最長有效(格式正確且連續)括號子串的長度。- 在最長子字符串上更進一步;
- 動態規劃,難點找到遞推公式;
-
刪除無效的括號
給你一個由若干括號和字母組成的字符串
s,刪除最小數量的無效括號,使得輸入的字符串有效。- 對于括號類的回溯:做括號一定大于等于右括號;
- 暴力搜索;
-
正則表達式匹配
給你一個字符串
s和一個字符規律p,請你來實現一個支持'.'和'*'的正則表達式匹配。'.'匹配任意單個字符'*'匹配零個或多個前面的那一個元素
所謂匹配,是要涵蓋 整個 字符串
s的,而不是部分字符串。- 動態規劃的一道題,理解正則匹配的底層邏輯;
- 拆分->怎么能推到遞推公式:
- 字符為'.':能匹配任意一個字符,均為true;
- 字符為'*':能匹配零個或任意個前面的字符;while
- 字符為其他:必須一對一匹配;
-
最長連續序列
給定一個未排序的整數數組
nums,找出數字連續的最長序列(不要求序列元素在原數組中連續)的長度。請你設計并實現時間復雜度為
O(n)的算法解決此問題。- 重點找兩個數:一端,一端小;
- 通過HashSet解決查詢問題,然后找到最小的端就okay;
-
單詞拆分
給你一個字符串
s和一個字符串列表wordDict作為字典。如果可以利用字典中出現的一個或多個單詞拼接出s則返回true。注意:不要求字典中出現的單詞全部都使用,并且字典中的單詞可以重復使用。
- 重點在于對s的的劃分,可能存在多種劃分【遞推】,但是不一定每種都能成功;
- 采取 雙指針 + HashSet ,只能進行一種劃分;
- 采取遞歸算法 + HashSet,考慮到所有方法,但是超時;
- 區間動態規劃;

浙公網安備 33010602011771號