演算法練習 動態規劃(一)

2021-10-08 11:17:46 字數 2089 閱讀 9032

給定乙個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。

說明:每次只能向下或者向右移動一步。

示例:輸入:

[[1

,3,1

],[1

,5,1

],[4

,2,1

]]

輸出: 7

解釋: 因為路徑 1→3→1→1→1 的總和最小。

解題思路

**

class

solution

int[

] min =

newint

[row]

[col]

; min[0]

[0]=grid[0]

[0];

for(

int i=

1;i)for

(int j=

1;j)for

(int i=

1;ireturn min[row-1]

[col-1];}}

結果

時間複雜度分析

陣列每乙個元素遍歷一次,故時間複雜度為o(m*n)

給定乙個整數 n,求以 1 … n 為節點組成的二叉搜尋樹有多少種?

示例:輸入: 3

輸出: 5

解釋:給定 n = 3, 一共有 5 種不同結構的二叉搜尋樹:

133

21\ /

// \ \

321132/

/ \ \

2123

解題思路

**

class

solution

int[

] num =

newint

[n+1];

num[0]

= num[1]

=1;for

(int i=

2;i<=n;i++)}

return num[n];}

}

結果

時間複雜度分析

雙重迴圈,時間複雜度為o(n^2)

給兩個整數陣列 a 和 b ,返回兩個陣列中公共的、長度最長的子陣列的長度。

示例:輸入:

a: [1,2,3,2,1]

b: [3,2,1,4,7]

輸出:3

解釋:長度最長的公共子陣列是 [3, 2, 1] 。

1 <= len(a), len(b) <= 1000

0 <= a[i], b[i] < 100

解題思路

**

class

solution

else

if(findmax

[j])}}

}return findmax;

}}

結果

時間複雜度分析

雙重迴圈,時間複雜度為o(m*n)

演算法 動態規劃(一)

要點是 記得return 函式,不然會棧溢位 有乙個x y的網格,小團要在此網格上從左上角到右下角,只能走格點且只能向右或向下走。請設計乙個演算法,計算小團有多少種走法。給定兩個正整數int x,int y,請返回小團的走法數目。這是動態規劃問題,也可以說是分類問題,因為只有向右,向下兩種可能 va...

動態規劃 一

在現實生活中,有一類活動的過程,由於它的特殊性,可將過程分程若干個互相聯絡的階段,在它的每一階段都需要作出決策,從而使整個過程達到最好的活動效果。當然,各個階段決策的選取不是任意確定的,它依賴於當前面臨的狀態,又印象以後的發展,當各個階段決策確定後,就組成乙個決策序列,因而也就確定了整個過程的一條活...

動態規劃(一)

動態規劃的兩種常用形式 1 遞迴型 在函式中呼叫自身 優點 直觀,容易編寫 缺點 可能會因為遞迴層數太深導致爆棧,函式呼叫帶來額外時間開銷。無法使用滾動陣列節省空間。總體來說,比遞推型慢。2 遞推型 for迴圈 效率高,有可能使用滾動陣列節省空間。有的問題只能用遞迴解決,有的問題既可以用遞迴,也可以...