当前位置:网站首页>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
}
}
边栏推荐
- Sword finger offer II 058: schedule
- Leetcode-6109: number of people who know secrets
- 2022 pole technology communication arm virtual hardware accelerates the development of Internet of things software
- Data visualization chart summary (I)
- 1041 Be Unique
- On the characteristics of technology entrepreneurs from Dijkstra's Turing Award speech
- Some common problems in the assessment of network engineers: WLAN, BGP, switch
- WordPress switches the page, and the domain name changes back to the IP address
- Basic explanation of typescript
- Sqlmap tutorial (1)
猜你喜欢

Introduction and experience of wazuh open source host security solution

Solution to game 10 of the personal field

Navicat連接Oracle數據庫報錯ORA-28547或ORA-03135

Groupbykey() and reducebykey() and combinebykey() in spark

1.15 - 输入输出系统

SPI details

Traditional databases are gradually "difficult to adapt", and cloud native databases stand out

LVS简介【暂未完成(半成品)】

WordPress switches the page, and the domain name changes back to the IP address

Leetcode-6110: number of incremental paths in the grid graph
随机推荐
QQ computer version cancels escape character input expression
Appium foundation - use the first demo of appium
2022年贵州省职业院校技能大赛中职组网络安全赛项规程
实时时钟 (RTC)
The difference between CPU core and logical processor
[rust notes] 16 input and output (Part 2)
leetcode-556:下一个更大元素 III
Daily question 2013 Detect square
[rust notes] 14 set (Part 2)
JS quickly converts JSON data into URL parameters
Navicat連接Oracle數據庫報錯ORA-28547或ORA-03135
中职网络安全技能竞赛——广西区赛中间件渗透测试教程文章
Is it impossible for lamda to wake up?
Smart construction site "hydropower energy consumption online monitoring system"
Leetcode-3: Longest substring without repeated characters
Binary search template
Sqlmap tutorial (II) practical skills I
Leetcode-6110: number of incremental paths in the grid graph
leetcode-6109:知道秘密的人数
Usage scenarios of golang context