dp思想,假設原格仔的代價陣列為grid
因為每次只能想下或者向右移動一步,所以如果從右下角開始向左上角反推時,dp[i][j]的最小代價為grid[i][j] + min(dp[i][j + 1], dp[i + 1][j])
直到反推回[0][0]點,就獲得了最小的代價值
或者從左上角向右下角推,每個點的最小代價dp[i][j] = grid[i][j] + min(dp[i - 1][j], dp[i][j - 1]),最後獲取最小代價時,需要獲取dp的最後乙個元素dp[-1][-1]
另外,如果不僅僅是獲取最小代價,而是要同時獲取路徑資訊的話,就需要用到雙向dijkstra、crp、ch等演算法了
class solution:
def minpathsum(self, grid: list[list[int]]) -> int:
if 0 == len(grid) or 0 == len(grid[0]):
return 0
dp_lst = [0] * len(grid[0])
for i in range(len(grid) - 1, -1, -1):
for j in range(len(grid[i]) - 1, -1, -1):
if i == len(grid) - 1 and j == len(grid[i]) - 1:
dp_lst[j] = grid[i][j]
elif i == len(grid) - 1 and j != len(grid[i]) - 1:
dp_lst[j] = grid[i][j] + dp_lst[j + 1]
elif i != len(grid) - 1 and j == len(grid[i]) - 1:
dp_lst[j] = grid[i][j] + dp_lst[j]
else:
dp_lst[j] = grid[i][j] + min(dp_lst[j], dp_lst[j + 1])
return dp_lst[0]
leetcode系列 演算法 中等 合併區間
按照第乙個數字進行排序 排序後,新增變數new list儲存遍歷結果,初始值為排序後的第一對數字 遍歷從index 1開始,每次遍歷乙個新數字對,只需要判斷第乙個數字,是否在new list最後乙個數字對中間 如果在,則合併兩對數字 如果不在,插入新數字對 class solution def me...
leetcode系列 演算法 中等 顏色分類
雙指標,乙個指標初始化時指向陣列頭,乙個指標指向陣列尾,具體流程如下 變數 left 左指標,儲存連續0的下乙個位置 right 右指標,儲存連續2的前乙個位置 index 遍歷時的索引 nums 原始陣列 流程 使用index從前向後nums 如果遇到0,則交換nums index 和nums l...
leetcode系列 演算法 中等 螺旋矩陣
記錄當前的迴圈次數,每迴圈一次,修改一下當前的狀態 根據當前的不同狀態,進行不同的處理遍歷方式,並將已處理的數字刪除 這樣迴圈完成一圈之後,內圈的迴圈方式,和外圈就相同了 持續迴圈到元素內的所有數字全部刪除 我設定的狀態列表如下 0 獲取當前第一行數字 1 獲取所有行的最後乙個數字 2 按照倒序獲取...