Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 6e67b4a

Browse files
committed
feat: add solutions to lc problem: No.1458
No.1458.Max Dot Product of Two Subsequences
1 parent 52df4d5 commit 6e67b4a

File tree

7 files changed

+233
-3
lines changed

7 files changed

+233
-3
lines changed

‎solution/1400-1499/1458.Max Dot Product of Two Subsequences/README.md‎

Lines changed: 89 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,22 +63,110 @@
6363

6464
<!-- 这里可写通用的实现逻辑 -->
6565

66+
**方法一:动态规划**
67+
68+
定义 $dp[i][j]$ 表示 $nums1$ 前 $i$ 个元素和 $nums2$ 前 $j$ 个元素得到的最大点积。
69+
70+
那么有:
71+
72+
$$
73+
dp[i][j]=max(dp[i-1][j], dp[i][j - 1], max(dp[i - 1][j - 1], 0) + nums1[i] \times nums2[j])
74+
$$
75+
76+
答案为 $dp[m][n]$。
77+
78+
时间复杂度 $O(m \times n),ドル空间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别是数组 $nums1$ 和 $nums2$ 的长度。
79+
6680
<!-- tabs:start -->
6781

6882
### **Python3**
6983

7084
<!-- 这里可写当前语言的特殊实现逻辑 -->
7185

7286
```python
73-
87+
class Solution:
88+
def maxDotProduct(self, nums1: List[int], nums2: List[int]) -> int:
89+
m, n = len(nums1), len(nums2)
90+
dp = [[-inf] * (n + 1) for _ in range(m + 1)]
91+
for i in range(1, m + 1):
92+
for j in range(1, n + 1):
93+
v = nums1[i - 1] * nums2[j - 1]
94+
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1],
95+
max(dp[i - 1][j - 1], 0) + v)
96+
return dp[-1][-1]
7497
```
7598

7699
### **Java**
77100

78101
<!-- 这里可写当前语言的特殊实现逻辑 -->
79102

80103
```java
104+
class Solution {
105+
public int maxDotProduct(int[] nums1, int[] nums2) {
106+
int m = nums1.length, n = nums2.length;
107+
int[][] dp = new int[m + 1][n + 1];
108+
for (int[] e : dp) {
109+
Arrays.fill(e, Integer.MIN_VALUE);
110+
}
111+
for (int i = 1; i <= m; ++i) {
112+
for (int j = 1; j <= n; ++j) {
113+
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
114+
dp[i][j] = Math.max(dp[i][j], Math.max(0, dp[i - 1][j - 1]) + nums1[i - 1] * nums2[j - 1]);
115+
}
116+
}
117+
return dp[m][n];
118+
}
119+
}
120+
```
121+
122+
### **C++**
123+
124+
```cpp
125+
class Solution {
126+
public:
127+
int maxDotProduct(vector<int>& nums1, vector<int>& nums2) {
128+
int m = nums1.size(), n = nums2.size();
129+
vector<vector<int>> dp(m + 1, vector<int>(n + 1, INT_MIN));
130+
for (int i = 1; i <= m; ++i) {
131+
for (int j = 1; j <= n; ++j) {
132+
int v = nums1[i - 1] * nums2[j - 1];
133+
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
134+
dp[i][j] = max(dp[i][j], max(0, dp[i - 1][j - 1]) + v);
135+
}
136+
}
137+
return dp[m][n];
138+
}
139+
};
140+
```
81141
142+
### **Go**
143+
144+
```go
145+
func maxDotProduct(nums1 []int, nums2 []int) int {
146+
m, n := len(nums1), len(nums2)
147+
dp := make([][]int, m+1)
148+
for i := range dp {
149+
dp[i] = make([]int, n+1)
150+
for j := range dp[i] {
151+
dp[i][j] = math.MinInt32
152+
}
153+
}
154+
for i := 1; i <= m; i++ {
155+
for j := 1; j <= n; j++ {
156+
v := nums1[i-1] * nums2[j-1]
157+
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
158+
dp[i][j] = max(dp[i][j], max(0, dp[i-1][j-1])+v)
159+
}
160+
}
161+
return dp[m][n]
162+
}
163+
164+
func max(a, b int) int {
165+
if a > b {
166+
return a
167+
}
168+
return b
169+
}
82170
```
83171

84172
### **...**

‎solution/1400-1499/1458.Max Dot Product of Two Subsequences/README_EN.md‎

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,94 @@ Their dot product is -1.</pre>
4545

4646
## Solutions
4747

48+
Dynamic Programming.
49+
4850
<!-- tabs:start -->
4951

5052
### **Python3**
5153

5254
```python
53-
55+
class Solution:
56+
def maxDotProduct(self, nums1: List[int], nums2: List[int]) -> int:
57+
m, n = len(nums1), len(nums2)
58+
dp = [[-inf] * (n + 1) for _ in range(m + 1)]
59+
for i in range(1, m + 1):
60+
for j in range(1, n + 1):
61+
v = nums1[i - 1] * nums2[j - 1]
62+
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1],
63+
max(dp[i - 1][j - 1], 0) + v)
64+
return dp[-1][-1]
5465
```
5566

5667
### **Java**
5768

5869
```java
70+
class Solution {
71+
public int maxDotProduct(int[] nums1, int[] nums2) {
72+
int m = nums1.length, n = nums2.length;
73+
int[][] dp = new int[m + 1][n + 1];
74+
for (int[] e : dp) {
75+
Arrays.fill(e, Integer.MIN_VALUE);
76+
}
77+
for (int i = 1; i <= m; ++i) {
78+
for (int j = 1; j <= n; ++j) {
79+
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
80+
dp[i][j] = Math.max(dp[i][j], Math.max(0, dp[i - 1][j - 1]) + nums1[i - 1] * nums2[j - 1]);
81+
}
82+
}
83+
return dp[m][n];
84+
}
85+
}
86+
```
87+
88+
### **C++**
89+
90+
```cpp
91+
class Solution {
92+
public:
93+
int maxDotProduct(vector<int>& nums1, vector<int>& nums2) {
94+
int m = nums1.size(), n = nums2.size();
95+
vector<vector<int>> dp(m + 1, vector<int>(n + 1, INT_MIN));
96+
for (int i = 1; i <= m; ++i) {
97+
for (int j = 1; j <= n; ++j) {
98+
int v = nums1[i - 1] * nums2[j - 1];
99+
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
100+
dp[i][j] = max(dp[i][j], max(0, dp[i - 1][j - 1]) + v);
101+
}
102+
}
103+
return dp[m][n];
104+
}
105+
};
106+
```
59107
108+
### **Go**
109+
110+
```go
111+
func maxDotProduct(nums1 []int, nums2 []int) int {
112+
m, n := len(nums1), len(nums2)
113+
dp := make([][]int, m+1)
114+
for i := range dp {
115+
dp[i] = make([]int, n+1)
116+
for j := range dp[i] {
117+
dp[i][j] = math.MinInt32
118+
}
119+
}
120+
for i := 1; i <= m; i++ {
121+
for j := 1; j <= n; j++ {
122+
v := nums1[i-1] * nums2[j-1]
123+
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
124+
dp[i][j] = max(dp[i][j], max(0, dp[i-1][j-1])+v)
125+
}
126+
}
127+
return dp[m][n]
128+
}
129+
130+
func max(a, b int) int {
131+
if a > b {
132+
return a
133+
}
134+
return b
135+
}
60136
```
61137

62138
### **...**
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution {
2+
public:
3+
int maxDotProduct(vector<int>& nums1, vector<int>& nums2) {
4+
int m = nums1.size(), n = nums2.size();
5+
vector<vector<int>> dp(m + 1, vector<int>(n + 1, INT_MIN));
6+
for (int i = 1; i <= m; ++i) {
7+
for (int j = 1; j <= n; ++j) {
8+
int v = nums1[i - 1] * nums2[j - 1];
9+
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
10+
dp[i][j] = max(dp[i][j], max(0, dp[i - 1][j - 1]) + v);
11+
}
12+
}
13+
return dp[m][n];
14+
}
15+
};
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
func maxDotProduct(nums1 []int, nums2 []int) int {
2+
m, n := len(nums1), len(nums2)
3+
dp := make([][]int, m+1)
4+
for i := range dp {
5+
dp[i] = make([]int, n+1)
6+
for j := range dp[i] {
7+
dp[i][j] = math.MinInt32
8+
}
9+
}
10+
for i := 1; i <= m; i++ {
11+
for j := 1; j <= n; j++ {
12+
v := nums1[i-1] * nums2[j-1]
13+
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
14+
dp[i][j] = max(dp[i][j], max(0, dp[i-1][j-1])+v)
15+
}
16+
}
17+
return dp[m][n]
18+
}
19+
20+
func max(a, b int) int {
21+
if a > b {
22+
return a
23+
}
24+
return b
25+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Solution {
2+
public int maxDotProduct(int[] nums1, int[] nums2) {
3+
int m = nums1.length, n = nums2.length;
4+
int[][] dp = new int[m + 1][n + 1];
5+
for (int[] e : dp) {
6+
Arrays.fill(e, Integer.MIN_VALUE);
7+
}
8+
for (int i = 1; i <= m; ++i) {
9+
for (int j = 1; j <= n; ++j) {
10+
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
11+
dp[i][j] = Math.max(dp[i][j], Math.max(0, dp[i - 1][j - 1]) + nums1[i - 1] * nums2[j - 1]);
12+
}
13+
}
14+
return dp[m][n];
15+
}
16+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
class Solution:
2+
def maxDotProduct(self, nums1: List[int], nums2: List[int]) -> int:
3+
m, n = len(nums1), len(nums2)
4+
dp = [[-inf] * (n + 1) for _ in range(m + 1)]
5+
for i in range(1, m + 1):
6+
for j in range(1, n + 1):
7+
v = nums1[i - 1] * nums2[j - 1]
8+
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1],
9+
max(dp[i - 1][j - 1], 0) + v)
10+
return dp[-1][-1]

‎solution/1400-1499/1461.Check If a String Contains All Binary Codes of Size K/README.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252

5353
遍历字符串 $s,ドル用一个哈希表存储所有长度为 $k$ 的不同子串。只需要判断子串数能否达到 2ドル^k$ 即可。
5454

55-
时间复杂度 $O(n \times k),ドル其中 $n$ 是字符串 $s$ 的长度,$k$ 是子串长度。
55+
时间复杂度 $O(n \times k),ドル其中 $n$ 是字符串 $s$ 的长度,$k$ 是子串长度。
5656

5757
**方法二:滑动窗口**
5858

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /