1. 程式人生 > >LeetCode編程總結

LeetCode編程總結

必須 比較 本質 就是 處理 開始 解決 tco 反轉鏈表

# 1、在有序表中查找兩數組指定的和,雙指針法
# 2、滑動窗口 : 連續子數組之和
# 3、二分查找 : 順序數組中查找特定的值

# 4、遞歸程序的真正的構建是從底向上的,這就是為什麽遞歸終止條件要寫在最前面
# 參見 反轉鏈表的遞歸程序 LeetCode206

# 5、 鏈表歸並排序的遞歸過程,要好好體會一下

# 6、樹型的暴力搜索(全路徑搜索 、DFS )需要進行回溯 參見 LeetCode 93

# 7、利用 return 能使樹型遞歸提早結束,類似於DFS 參見 LeetCode 37

# 8、記憶化搜索,自上而下的解決問題、 動態規劃,自下而上的解決問題 參見斐波那契數列

# 9、記憶化遞歸時,一開始就需要判斷原問題是否被再次遇到,若遇到則返回記憶值,若沒遇到則
# 進入遞歸過程,並更新記憶值 錯誤來源參見 LeetCode 198

# 10、遞歸返回的過程,其實就是自底向上的構建過程(類似於動態規劃)、 參見 LeetCode 337 劉宇波代碼3

# 11、深度遞歸和層次遞歸的感悟: 參見LeetCode 322
#深度遞歸需要使用傳遞狀態參數,並一般使用全局變量更新最優解
#層數遞歸只需要考慮底層和上一層的遞推關系,一般不使用全局變量

# 12、01背包問題:一個序列的各個元素都有選與不選兩種狀態
# 20190113

# 13、數組的記憶化遞歸和字典的記憶化遞歸? LeetCode 137 20190119

# 14、動態規劃難的是狀態的定義, 如 LeetCode 376 上升沿和下降沿的狀態

# 15、動態規劃狀態定義的一般原則是F(n,r):n是問題規模,r是該規模下的特定限定,比如LeetCode 376
# 的狀態定義就是一個很好的啟示

# 16、動態規劃總結:1)解空間樹加重復子問題 生長學習法
# 2)最優問題: 最大值最小值……
# 3)子問題的同質: 都是連續序列、矩陣……
# 4)重復問題: 空間換時間 狀態矩陣
# 5)從頂向下:記憶數組 從底向上:遞推 終局思想 本質是同一個東西。 20190228


# 17、編程要註意狀態的定義,變量的代表含義 ,如直接插入排序 j代表a[i]直接要插入的空預留位值,j-1 要不斷的
# 與temp=a[i] 比較 :即要找到 a[i] 插入的最終位置。


# 算法面試一定要先實現出來,然後再考慮優化的可行性。
# 算法註重的是思想,如leetcode 108 怎樣才能想到用遞歸的思想呢?
# 總的來說還是我的編程思想的素養不夠呀 --20190305
# 編程題要進行一定的抽象建模 如 LeetCode 235 二叉樹搜索樹的公共祖先問題。
# 編程時一定要註意函數的定義是什麽? 如Leetcode 236 函數的定義是返回最終的答案 20100305
# 編程問題也要註意分治討論:即劃分問題的子空間:
# 如 leetcode404 : 1)根節點有左葉子 2)根節點沒左葉子


# 20190302 找工作期間 總結
#18、 數組類問題:
# 1)滑動窗口
# 2)查找表
# 解空間樹
# 1)初值狀態的確定
# 2)搜索策略 : 剪支 (優化問題)
# 遞歸和分治類問題:是個基本的編程思想(函數的定義很重要)
# 1)遞歸返回值的處理:
# 要定義好函數的返回邏輯或狀態或者值,並從底向上構建
# 如 leetcode 108 和 113 20190305
# 2)遞歸程序的編寫:
# # 先寫返回條件
# 返回條件寫好了,就可以當做函數功能已經完成,並可以分治的解決問題了
# 3) 數據結構有遞歸結構,要考慮一下遞歸的算法
# 如數組、鏈表、二叉樹等 20190305
# 4)visit 數組用於去重
# 5)狀態出棧用於回溯
# 動態規劃:
# 1)初值的設定是關鍵:a 狀態函數的定義可以說明函數的初值 如 01背包問題
# b 初值的設置技巧可以用最小規模數據進行驗證
# 2)狀態的遞推順序:新值必須在舊值的基礎上
# 20190306
# 貪心:最強烈的狀態給最強烈的需求 :分餅幹 20190306
# 1)證明過程只能是反證法
#

LeetCode編程總結