1.basic skills:遞歸+暴力搜索算法
2.動態規劃Dynamic Programming(DP)編程
(1)本質:遞歸。遞歸不能解決的問題動態規劃也不能解決。數組
(2)原問題(N)- >子問題->原問題(N)。把原問題拆解成子問題,在獲得子問題的答案以後再獲得原問題的答案。遞歸關注的是解決問題的方式,怎麼把很複雜的問題拆解成一層一層的,遞歸的時間複雜度是多少等寫完以後再說。spa
(3)最優子結構:子問題的最優決策能夠導出原問題的最優決策設計
(4)無後效性。code
(5)重疊子問題:去冗餘,空間換時間。blog
3.target:分析-->coding->ac遞歸
4.leetcode實訓leetcode
(198搶劫)代碼:get
去冗餘以前
package com.nowcoder.leetcode; public class HouseRobber_198 { //遞歸的方式,idx表明已經搶到的位置, public static int solve1(int idx,int[] nums){ //越界就返回 if(idx<0){ return 0; } return Math.max(nums[idx]+solve1(idx-2,nums),solve1(idx-1,nums)); } //第一種方法暴力遞歸 public static int rob(int[] nums){ return solve1(nums.length,nums); } }
去冗餘以後
class Solution { public static int[] res; public int solve(int idx,int[] nums){ if(idx<0){ return 0; } if(res[idx]>=0){ return res[idx]; } res[idx]=Math.max(nums[idx]+solve(idx-2,nums),solve(idx-1,nums)); return res[idx]; } public int rob(int[] nums){ res=new int[nums.length]; for(int i = 0 ; i<nums.length;++i){ res[i]=-1; } return solve(nums.length-1,nums); } }
5.共性問題:
(1)套路:最優,最大,最小,最長,計數
(2)離散問題:容易設計狀態(整數的01揹包問題)
(3)最優子結構:N-1能夠推導出N
6.基本步驟:四個步驟
(1)涉及暴力算法,找到冗餘
(2)設計並存儲堆的狀態(一維、二維、三維數組甚至是用Map)
(3)遞歸式(狀態轉移方程):遞歸中有兩個值組成,每一個值表明一種決策,每一個決策裏面都有一個遞歸。
(4)自底向上計算最優解(編程方式):先計算比較大的,而後計算比較小的,可是自頂向下代碼量比較大的。自底向上是先計算比較小的,