早起刷题(Day 14)
洪笳淏 Lv4

又没早起,上海这疫情何时是个头啊😮‍💨

剑指 Offer 47. 礼物的最大价值

#动态规划

题目描述

在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
示例 1:
输入:
[
  [1,3,1],
  [1,5,1],
  [4,2,1]
]
输出: 12
解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物
 

提示:
0 < grid.length <= 200
0 < grid[0].length <= 200

解题思路

(1). 使用 BFS —— 爆内存;
(2). 使用 DFS —— 超时;
(3). 那就老老实实动态规划吧。

时间复杂度

O(M*N)

解题代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
func maxValue(grid [][]int) int {

dp := make([][]int, len(grid))
for i:=0; i<len(dp); i++ {
dp[i] = make([]int, len(grid[0]))
}

dp[0][0] = grid[0][0]
for i:=1; i<len(grid); i++ {
dp[i][0] = dp[i-1][0] + grid[i][0]
}

for i:=1; i<len(grid[0]); i++ {
dp[0][i] = dp[0][i-1] + grid[0][i]
}

for i:=1; i<len(grid); i++ {
for j:=1; j<len(grid[0]); j++ {
dp[i][j] = max(dp[i-1][j],dp[i][j-1])+grid[i][j]
}
}

return dp[len(grid)-1][len(grid[0])-1]
}

func max(a,b int) int {
if a > b {
return a
}

return b
}

LeetCode245. 最短单词距离 III

#数组

题目描述

给定一个字符串数组 wordsDict 和两个字符串 word1 和 word2 ,返回列表中这两个单词之间的最短距离。
注意:word1 和 word2 是有可能相同的,并且它们将分别表示为列表中 两个独立的单词 。

1
2
3
4
5
6
7
8
9
10
11
12
13
示例 1:
输入:wordsDict = ["practice", "makes", "perfect", "coding", "makes"], word1 = "makes", word2 = "coding"
输出:1

示例 2:
输入:wordsDict = ["practice", "makes", "perfect", "coding", "makes"], word1 = "makes", word2 = "makes"
输出:3

提示:
1 <= wordsDict.length <= 105
1 <= wordsDict[i].length <= 10
wordsDict[i] 由小写英文字母组成
word1 和 word2 都在 wordsDict 中

解题思路

(1). 分两种情况讨论,当 word1 == word2 时 和 word1 != word2 时;
(2). 当 word1 == word2 时,遍历 wordDict,将 word1 的索引号用数组保存,之后再通过一次遍历,计算相邻索引号最小的差;
(3). 当 word1 != word2 时,通过两个标记 idx1idx2,分别记录下每次出现 word1word2 的索引号,然后通过一次遍历 wordDict,计算出最小的差。

时间复杂度

O(N)

解题代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
func shortestWordDistance(wordsDict []string, word1 string, word2 string) int {

idx1, idx2 := -1, -1
ret := math.MaxInt32

if word1 == word2 {
l := []int{}
for i:=0; i<len(wordsDict); i++ {
if wordsDict[i] == word1 {
l = append(l, i)
}
}

for i:=1; i<len(l); i++ {
ret = min(ret, l[i]-l[i-1])
}

return ret
}

for i:=0; i<len(wordsDict); i++ {
if wordsDict[i] == word1 {
idx1 = i
if idx2 != -1 {
ret = min(ret, abs(idx1,idx2))
}
} else if wordsDict[i] == word2 {
idx2 = i
if idx1 != -1 {
ret = min(ret, abs(idx1,idx2))
}
}
}

return ret
}

func min(a, b int) int {
if a < b {
return a
}

return b
}

func abs(a, b int) int {
if a > b {
return a-b
}

return b-a
}
  • Post title:早起刷题(Day 14)
  • Post author:洪笳淏
  • Create time:2022-04-16 11:00:00
  • Post link:https://jiahaohong1997.github.io/2022/04/16/早起刷题(Day 14)/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.
 Comments