程式碼隨想錄day34 || 62 不同路徑,63 不同路徑||,343整數拆分,96 不同搜尋二叉樹

周公瑾55發表於2024-08-19

不同路徑

image

func uniquePaths(m int, n int) int {
	// dp五部曲
	// dp陣列以及下標的含義  dp[i][j]代表從0,0 走到i,j的不同路徑條數
	// 遞推公式			dp[i][j] = dp[i-1][j] + dp[i][j-1]
	// dp陣列的初始化     dp[i][0] == dp[0][j] = 1
	// 遍歷順序	外層按照行,內層按照列遍歷
	// 列印dp
	var dp = make([][]int, m)
	for i:=0; i<m; i++{
		dp[i] = make([]int, n)
		for j:=0; j<n; j++{
			if i==0 || j==0 {
				dp[i][j] = 1
			}else {
				dp[i][j] = dp[i-1][j] + dp[i][j-1]
			}
		}
	}
	//fmt.Println(dp)
	return dp[m-1][n-1]
}

// 63 不同路徑||

func uniquePathsWithObstacles(obstacleGrid [][]int) int {
	// dp五部曲
	// 確定dp陣列以及下標含義 dp[i][j] 表示1,1 到i, j不同路徑數
	// 遞推公式,if not 障礙 {dp[i][j] = dp[i-1][j] + dp[i][j-1]} else {dp[i][j] = 0}
	// 初始化dp dp[0][j] == dp[i][0] == 0, dp[1][1] = 1
	// 遍歷順序,先橫向後縱向
	// 列印dp
	if obstacleGrid[0][0] == 1 {
		return 0
	}
	var dp = make([][]int, len(obstacleGrid)+1)
	for i, _ := range dp {
		dp[i] = make([]int, len(obstacleGrid[0])+1)
	}
	//dp[1][1] = 1 // 因為如果初始位置是障礙物,已經被最上面的return情況排除了
	//fmt.Println(dp)

	for i:=0; i<len(obstacleGrid); i++ {
		for j:=0; j<len(obstacleGrid[0]); j++{
			if obstacleGrid[i][j] == 1{
				// 障礙物
				dp[i+1][j+1] = 0
			} else if i==0 && j==0{
				dp[i+1][j+1] = 1
			} else {
				dp[i+1][j+1] = dp[i][j+1] + dp[i+1][j]
			}
		}
	}
	//fmt.Println(dp)
	return dp[len(obstacleGrid)][len(obstacleGrid[0])]
}

343 整數拆分

func integerBreak(n int) int {
	// dp以及下標含義  dp[i] 代表拆分i能得到的最大積
	// 遞推公式 dp[i] = max(j*(i-j), j*dp[i-j], dp[i]) //j*(i-j) 代表不拆分i-j得到積, j*dp[i-j]代表拆分i-j得到最大積
	// 初始化 dp[0] = 0 dp[1] = 0  dp[2] = (1x1) =1
	// 遍歷順序 3-->n
	// dayin
	var dp = []int{0,0,1}
	if n < 3 {
		return dp[n]
	}else {
		dp = append(dp, make([]int, (n+1)-3)...)
	}
	for i := 3; i <= n; i++{
		for j:=1; j<=i/2; j++{
			m := max(j*(i-j), j*dp[i-j])
			if m>dp[i] {
				dp[i] = m
			}
		}
	}
	//fmt.Println(dp)
	return dp[n]
}

96 不同搜尋二叉樹

func numTrees(n int) int {
	// dp陣列以及下標含義 dp[i] 表示 i個節點的二叉搜尋樹數量
	// 遞推公式 dp[i] = Σ(0, i)(dp[j-1] * dp[i-j])  dp[j-1]代表左子樹的數量 dp[i-j]代表右子樹的數量,相乘就是j時的總組合,
	// 初始化 dp[0] = 1, dp[1] = 1, dp[2] = 2
	// 遍歷順序,i從0遍歷到n, j每次從1遍歷到i
	// 列印

	var dp = []int{1,1,2}
	if n <= 2 {
		return dp[n]
	}else {
		dp = append(dp, make([]int, n+1-3)...)
	}
	for i:=3; i<=n; i++{
		for j:=1; j<=i; j++{
			dp[i] += dp[j-1] * dp[i-j]
		}
	}
	fmt.Println(dp)
	return dp[n]
}

相關文章