題目:
給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。
相鄰的結點在這裡指的是 下標 與 上一層結點下標 相同或者等於 上一層結點下標 + 1 的兩個結點。
示例
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
最小路徑和:2+3+5+1=11;
思路分析:
以示例為例子,假設是a,下標從1開始計算,到達a[4][2]的只有兩種,從a[3][2]或者a[3][1],如果到達a[3][2]和a[3][1]的最短路徑已經找到,那麼從這兩者中選乙個小的到達a[4][2],到達a[4][2]的也一定是其最優方案,即最小路徑和的特點能夠得到保留,此即動態規劃的可行性證明
狀態轉移方程:
d p[
i][j
]表示到
達i,j
位置的最
小路徑和
,下標均
從1開始
計數
dp[i][j]表示到達i,j位置的最小路徑和,下標均從1開始計數
dp[i][
j]表示
到達i,
j位置的
最小路徑
和,下標
均從1開
始計數1:邊界條件 j= =1 或者 j= =i,分別是第一列和斜邊
當j= =1:
d p[
i][j
]=dp
[i−1
][j]
dp[i][j]=dp[i-1][j]
dp[i][
j]=d
p[i−
1][j
]當j= =i:
d p[
i][j
]=dp
[i−1
][j−
1]
dp[i][j]=dp[i-1][j-1]
dp[i][
j]=d
p[i−
1][j
−1]
2:一般情況
d p[
i][j
]=mi
n(dp
[i−1
][j−
1],d
p[i−
1][j
])+t
rang
le[i
][j]
dp[i][j]=min(dp[i-1][j-1],dp[i-1][j])+trangle[i][j]
dp[i][
j]=m
in(d
p[i−
1][j
−1],
dp[i
−1][
j])+
tran
gle[
i][j
] 空間優化的思考:
優化到o(n)空間,因為本質上,我這一行的資料,最短路徑只與上一行的資料有關,所以我們可以只用,例如pre,cur兩個陣列,每次pre保持上一行的資料,cur計算當前行;通過指標更方便修改,只要修改指向,而不需要每次結束時將cur複製到pre中充當下一次的pre
class solution
if(j == i)
a2[j]
=min
(a1[j -1]
, a1[j]
)+ ********[i]
[j];
}int
* a3 = a1;
//修改指向
a1 = a2;
a2 = a3;
//delete a3;
}int min_num = a1[0]
;for
(int i =
1; i < n; i++)if
(min_num > a1[i]
) min_num = a1[i]
;return min_num;}}
;
每日一題 LeetCode
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...
每日一題 120 矩陣置零
給定乙個 m x n 的矩陣,如果乙個元素為 0,則將其所在行和列的所有元素都設為 0。請使用原地演算法。示例 1 輸入 1,1,1 1,0,1 1,1,1 輸出 1,0,1 0,0,0 1,0,1 示例 2 輸入 0,1,2,0 3,4,5,2 1,3,1,5 輸出 0,0,0,0 0,4,5,0...
LeetCode每日一題(題1028)
最近在刷leetcode每日一題,每次做完之後總能有些收穫,所以想著不如每天寫個部落格記錄一下做的題目的解法以及自己寫的時候問題出在 從先序遍歷還原二叉樹 題目大意 給出乙個字串 1 2 3 4 5 6 7 1代表節點的值,前面的 個數代表節點的深度。如果只有乙個子節點,保證這個節點為左子節點。返回...