当前位置:网站首页>Leetcode dynamic programming
Leetcode dynamic programming
2022-07-05 06:14:00 【Dawnlighttt】
List of articles
q5 Longest text substring
Answer key
First, find out the dynamic transfer equation , You can find dp[i][j] If it's a palindrome string , that dp[i + 1][j - 1] Must be palindrome string , among dp[i][j] Indicates a string subscript i To j The string of . At the same time, boundary conditions should also be considered , That is, if the length of the substring is less than 2, Then it must be a palindrome string , If the substring length is equal to 2, Then the palindrome string only needs to meet dp[i] == d[j].
func longestPalindrome(s string) string {
n := len(s)
dp := make([][]bool, n)
for i, _ := range dp {
dp[i] = make([]bool, n)
}
ans := ""
// The first layer traverses the length of the substring
for l := 0; l < n; l++ {
// The second layer is the left boundary of the substring
for i := 0; i + l < n; i++ {
// j Is the right boundary of the substring
j := i + l
if l == 0 {
dp[i][j] = true
} else if l == 1 {
dp[i][j] = (s[i] == s[j])
} else {
dp[i][j] = (s[i] == s[j] && dp[i + 1][j - 1])
}
// Update Max
if dp[i][j] && l + 1 > len(ans) {
ans = s[i:j + 1]
}
}
}
return ans
}
q53 Maximum subarray and
Answer key
Traversal array , Open up a new array dp, Loop traversal nums, Give Way dp[i] = nums[i], And then determine dp[i] + dp[i - 1] Is it greater than dp[i], If greater than, let dp[i] += dp[i - 1]
func maxSubArray(nums []int) int {
dp := make([]int, len(nums))
dp[0] = nums[0]
maxSum := nums[0]
for i := 1; i < len(nums); i++ {
dp[i] = nums[i]
if dp[i - 1] + dp[i] > dp[i] {
dp[i] += dp[i - 1]
}
if dp[i] > maxSum {
maxSum = dp[i]
}
}
return maxSum
}
q62 Different paths
Answer key
The dynamic transfer equation of this topic is very simple , Because you can only go down and right , therefore dp[i][j] = dp[i - 1][j] + dp[i][j - 1], Finally, deal with the boundary conditions ,dp[i][0] and dp[0][j] All equal to 1, Because there is only one path to the border .
func uniquePaths(m int, n int) int {
dp := make([][]int, m)
for i := 0; i < m; i++ {
dp[i] = make([]int, n)
dp[i][0] = 1
}
for j := 0; j < n; j++ {
dp[0][j] = 1
}
for i := 1; i < m; i++ {
for j := 1; j < n; j++ {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
}
}
return dp[m - 1][n - 1]
}
q64 Minimum path sum
Answer key
This problem is solved by dynamic programming , The dynamic transfer equation is dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]), Then deal with the boundary situation , Boundary is when i == 0 perhaps j == 0 When , This is the time dp[i][0] = dp[i - 1][0],dp[0][j] = dp[0][j - 1].
func minPathSum(grid [][]int) int {
m, n := len(grid), len(grid[0])
dp := make([][]int, m)
dp[0] = make([]int, n)
dp[0][0] = grid[0][0]
for i := 1; i < m; i++ {
dp[i] = make([]int, n)
dp[i][0] = grid[i][0]
dp[i][0] += dp[i - 1][0]
}
for j := 1; j < n; j++ {
dp[0][j] = grid[0][j]
dp[0][j] += dp[0][j - 1]
}
for i := 1; i < m; i++ {
for j := 1; j < n; j++ {
dp[i][j] = grid[i][j]
dp[i][j] += min(dp[i - 1][j], dp[i][j - 1])
}
}
return dp[m - 1][n - 1]
}
func min(a, b int) int {
if a < b {
return a
} else {
return b
}
}
q70 climb stairs
Answer key
This problem can be solved by recursion , The recurrence formula is step[i] = step[i - 1] + step[i - 2], Then deal with the boundary conditions , When i == 1 when ,step[1] = 1, When i == 2 when ,step[2] = 2.
func climbStairs(n int) int {
if n <= 2 {
return n
}
step1, step2, step3 := 1, 2, 0
for i := 3; i <= n; i++ {
step3 = step1 + step2
step1 = step2
step2 = step3
}
return step3
}
q118 Yang hui triangle
Answer key
This problem is solved by dynamic programming , The state transition equation is dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j], Then deal with the boundary conditions , If the number of rows is less than 3, Then all elements are 1, When the number of lines is greater than or equal to 3 when , The state transition equation is satisfied only when the number of columns is not the first and last , Otherwise, it's all for 1 .
func generate(numRows int) [][]int {
res := [][]int{
{
1}}
if numRows == 1 {
return res
}
res = append(res, []int{
1, 1})
if numRows == 2 {
return res
}
for i := 3; i <= numRows; i++ {
var rows []int
for j := 1; j <= i; j++ {
if j != 1 && j != i {
rows = append(rows, res[i - 2][j - 2] + res[i - 2][j - 1])
} else {
rows = append(rows, 1)
}
}
res = append(res, rows)
}
return res
}
q300 Longest ascending subsequence
Answer key
First define an array dp Used to save the length of the longest ascending subsequence up to the current element position . Use a two-layer loop , The first level of loop traversal nums Array , The second layer of loop traversal starts from zero to nums The previous element of the current element of the array , If the current element satisfies nums[i] > num[j] && dp[j] + 1 > dp[i], Is executed dp[i] = dp[j] + 1 To update the longest ascending subsequence .
func lengthOfLIS(nums []int) int {
dp := make([]int, len(nums))
maxLen := 0
for i := 0; i < len(nums); i++ {
dp[i] = 1
for j := 0; j < i; j++ {
if nums[i] > nums[j] && dp[j] + 1 > dp[i] {
dp[i] = dp[j] + 1
}
}
if dp[i] > maxLen {
maxLen = dp[i]
}
}
return maxLen
}
q1143 Longest common subsequence
Answer key
Define an array dp[i][j] Express text1[1…i] and text2[1…j] The length of the longest common subsequence of , So the final answer is dp[len1][len2].
This problem can be divided into three cases :
- text1[i] Not in the common subsequence , that dp[i][j] = dp[i - 1][j]
- text2[j] Not in the common subsequence , that dp[i][j] = dp[i][j - 1]
- text1[i] == text2[j], This is the time dp[i][j] = dp[i - 1][j - 1] + 1
dp[i][j] Take the maximum of the above three cases . Then deal with the boundary conditions ,dp[i][0] and dp[0][j] All for 0 .
func longestCommonSubsequence(text1 string, text2 string) int {
len1, len2 := len(text1), len(text2)
dp := make([][]int, len1 + 1)
for i := 0; i <= len1; i++ {
dp[i] = make([]int, len2 + 1)
}
for i := 1; i <= len1; i++ {
for j := 1; j <= len2; j++ {
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
if text1[i - 1] == text2[j - 1] {
dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + 1)
}
}
}
return dp[len1][len2]
}
func max(a, b int) int {
if a > b {
return a
} else {
return b
}
}
边栏推荐
- On the characteristics of technology entrepreneurs from Dijkstra's Turing Award speech
- 【Rust 笔记】16-输入与输出(下)
- Shutter web hardware keyboard monitoring
- MatrixDB v4.5.0 重磅发布,全新推出 MARS2 存储引擎!
- Dynamic planning solution ideas and summary (30000 words)
- Sword finger offer II 058: schedule
- Smart construction site "hydropower energy consumption online monitoring system"
- QQ电脑版取消转义符输入表情
- [rust notes] 15 string and text (Part 1)
- Usage scenarios of golang context
猜你喜欢

可变电阻器概述——结构、工作和不同应用

Implement an iterative stack

liunx启动redis

Appium自动化测试基础 — Appium测试环境搭建总结

On the characteristics of technology entrepreneurs from Dijkstra's Turing Award speech

Real time clock (RTC)

The connection and solution between the shortest Hamilton path and the traveling salesman problem

LVS简介【暂未完成(半成品)】
![[cloud native] record of feign custom configuration of microservices](/img/39/05cf7673155954c90e75a8a2eecd96.jpg)
[cloud native] record of feign custom configuration of microservices

Individual game 12
随机推荐
JS quickly converts JSON data into URL parameters
Shutter web hardware keyboard monitoring
927. Trisection simulation
Leetcode heap correlation
leetcode-3:无重复字符的最长子串
One question per day 1447 Simplest fraction
传统数据库逐渐“难适应”,云原生数据库脱颖而出
Usage scenarios of golang context
TypeScript 基础讲解
Introduction et expérience de wazuh open source host Security Solution
Regulations for network security events of vocational group in 2022 Guizhou Vocational College skill competition
快速使用Amazon MemoryDB并构建你专属的Redis内存数据库
Bit mask of bit operation
【LeetCode】Day94-重塑矩阵
【LeetCode】Day95-有效的数独&矩阵置零
QQ电脑版取消转义符输入表情
Leetcode-6110: number of incremental paths in the grid graph
[rust notes] 17 concurrent (Part 2)
Solution to game 10 of the personal field
1.13 - RISC/CISC