Skip to content

Commit 086e126

Browse files
committed
feat: add solutions to lc problem: No.1425
No.1425.Constrained Subsequence Sum
1 parent 284eb58 commit 086e126

File tree

8 files changed

+265
-2
lines changed

8 files changed

+265
-2
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
- [滑动窗口最大值](/solution/0200-0299/0239.Sliding%20Window%20Maximum/README.md) - `单调队列`
6060
- [满足不等式的最大值](/solution/1400-1499/1499.Max%20Value%20of%20Equation/README.md) - `单调队列`
6161
- [和至少为 K 的最短子数组](/solution/0800-0899/0862.Shortest%20Subarray%20with%20Sum%20at%20Least%20K/README.md) - `单调队列`
62+
- [带限制的子序列和](/solution/1400-1499/1425.Constrained%20Subsequence%20Sum/README.md) - `动态规划``单调队列优化`
6263

6364
### 3. 搜索
6465

README_EN.md

+1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ Complete solutions to [LeetCode](https://leetcode.com/problemset/all/), [LCOF](h
5757
- [Sliding Window Maximum](/solution/0200-0299/0239.Sliding%20Window%20Maximum/README_EN.md) - `Monotonic Queue`
5858
- [Max Value of Equation](/solution/1400-1499/1499.Max%20Value%20of%20Equation/README_EN.md) - `Monotonic Queue`
5959
- [Shortest Subarray with Sum at Least K](/solution/0800-0899/0862.Shortest%20Subarray%20with%20Sum%20at%20Least%20K/README_EN.md) - `Monotonic Queue`
60+
- [带限制的子序列和](/solution/1400-1499/1425.Constrained%20Subsequence%20Sum/README.md) - `Dynamic Programming`, `Monotonic Queue`
6061

6162
### 3. Search
6263

solution/1400-1499/1425.Constrained Subsequence Sum/README.md

+92-1
Original file line numberDiff line numberDiff line change
@@ -46,22 +46,113 @@
4646

4747
<!-- 这里可写通用的实现逻辑 -->
4848

49+
**方法一:动态规划 + 单调队列**
50+
4951
<!-- tabs:start -->
5052

5153
### **Python3**
5254

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

5557
```python
56-
58+
class Solution:
59+
def constrainedSubsetSum(self, nums: List[int], k: int) -> int:
60+
n = len(nums)
61+
dp = [0] * n
62+
ans = float('-inf')
63+
q = deque()
64+
for i, v in enumerate(nums):
65+
if q and i - q[0] > k:
66+
q.popleft()
67+
dp[i] = max(0, 0 if not q else dp[q[0]]) + v
68+
while q and dp[q[-1]] <= dp[i]:
69+
q.pop()
70+
q.append(i)
71+
ans = max(ans, dp[i])
72+
return ans
5773
```
5874

5975
### **Java**
6076

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

6379
```java
80+
class Solution {
81+
public int constrainedSubsetSum(int[] nums, int k) {
82+
int n = nums.length;
83+
int[] dp = new int[n];
84+
int ans = Integer.MIN_VALUE;
85+
Deque<Integer> q = new ArrayDeque<>();
86+
for (int i = 0; i < n; ++i) {
87+
if (!q.isEmpty() && i - q.peek() > k) {
88+
q.poll();
89+
}
90+
dp[i] = Math.max(0, q.isEmpty() ? 0 : dp[q.peek()]) + nums[i];
91+
while (!q.isEmpty() && dp[q.peekLast()] <= dp[i]) {
92+
q.pollLast();
93+
}
94+
q.offer(i);
95+
ans = Math.max(ans, dp[i]);
96+
}
97+
return ans;
98+
}
99+
}
100+
```
101+
102+
### **C++**
103+
104+
```cpp
105+
class Solution {
106+
public:
107+
int constrainedSubsetSum(vector<int>& nums, int k) {
108+
int n = nums.size();
109+
vector<int> dp(n);
110+
int ans = INT_MIN;
111+
deque<int> q;
112+
for (int i = 0; i < n; ++i)
113+
{
114+
if (!q.empty() && i - q.front() > k) q.pop_front();
115+
dp[i] = max(0, q.empty() ? 0 : dp[q.front()]) + nums[i];
116+
ans = max(ans, dp[i]);
117+
while (!q.empty() && dp[q.back()] <= dp[i]) q.pop_back();
118+
q.push_back(i);
119+
}
120+
return ans;
121+
}
122+
};
123+
```
64124
125+
### **Go**
126+
127+
```go
128+
func constrainedSubsetSum(nums []int, k int) int {
129+
n := len(nums)
130+
dp := make([]int, n)
131+
ans := math.MinInt32
132+
q := []int{}
133+
for i, v := range nums {
134+
if len(q) > 0 && i-q[0] > k {
135+
q = q[1:]
136+
}
137+
dp[i] = v
138+
if len(q) > 0 && dp[q[0]] > 0 {
139+
dp[i] += dp[q[0]]
140+
}
141+
for len(q) > 0 && dp[q[len(q)-1]] < dp[i] {
142+
q = q[:len(q)-1]
143+
}
144+
q = append(q, i)
145+
ans = max(ans, dp[i])
146+
}
147+
return ans
148+
}
149+
150+
func max(a, b int) int {
151+
if a > b {
152+
return a
153+
}
154+
return b
155+
}
65156
```
66157

67158
### **...**

solution/1400-1499/1425.Constrained Subsequence Sum/README_EN.md

+90-1
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,102 @@
4848
### **Python3**
4949

5050
```python
51-
51+
class Solution:
52+
def constrainedSubsetSum(self, nums: List[int], k: int) -> int:
53+
n = len(nums)
54+
dp = [0] * n
55+
ans = float('-inf')
56+
q = deque()
57+
for i, v in enumerate(nums):
58+
if q and i - q[0] > k:
59+
q.popleft()
60+
dp[i] = max(0, 0 if not q else dp[q[0]]) + v
61+
while q and dp[q[-1]] <= dp[i]:
62+
q.pop()
63+
q.append(i)
64+
ans = max(ans, dp[i])
65+
return ans
5266
```
5367

5468
### **Java**
5569

5670
```java
71+
class Solution {
72+
public int constrainedSubsetSum(int[] nums, int k) {
73+
int n = nums.length;
74+
int[] dp = new int[n];
75+
int ans = Integer.MIN_VALUE;
76+
Deque<Integer> q = new ArrayDeque<>();
77+
for (int i = 0; i < n; ++i) {
78+
if (!q.isEmpty() && i - q.peek() > k) {
79+
q.poll();
80+
}
81+
dp[i] = Math.max(0, q.isEmpty() ? 0 : dp[q.peek()]) + nums[i];
82+
while (!q.isEmpty() && dp[q.peekLast()] <= dp[i]) {
83+
q.pollLast();
84+
}
85+
q.offer(i);
86+
ans = Math.max(ans, dp[i]);
87+
}
88+
return ans;
89+
}
90+
}
91+
```
92+
93+
### **C++**
94+
95+
```cpp
96+
class Solution {
97+
public:
98+
int constrainedSubsetSum(vector<int>& nums, int k) {
99+
int n = nums.size();
100+
vector<int> dp(n);
101+
int ans = INT_MIN;
102+
deque<int> q;
103+
for (int i = 0; i < n; ++i)
104+
{
105+
if (!q.empty() && i - q.front() > k) q.pop_front();
106+
dp[i] = max(0, q.empty() ? 0 : dp[q.front()]) + nums[i];
107+
ans = max(ans, dp[i]);
108+
while (!q.empty() && dp[q.back()] <= dp[i]) q.pop_back();
109+
q.push_back(i);
110+
}
111+
return ans;
112+
}
113+
};
114+
```
57115
116+
### **Go**
117+
118+
```go
119+
func constrainedSubsetSum(nums []int, k int) int {
120+
n := len(nums)
121+
dp := make([]int, n)
122+
ans := math.MinInt32
123+
q := []int{}
124+
for i, v := range nums {
125+
if len(q) > 0 && i-q[0] > k {
126+
q = q[1:]
127+
}
128+
dp[i] = v
129+
if len(q) > 0 && dp[q[0]] > 0 {
130+
dp[i] += dp[q[0]]
131+
}
132+
for len(q) > 0 && dp[q[len(q)-1]] < dp[i] {
133+
q = q[:len(q)-1]
134+
}
135+
q = append(q, i)
136+
ans = max(ans, dp[i])
137+
}
138+
return ans
139+
}
140+
141+
func max(a, b int) int {
142+
if a > b {
143+
return a
144+
}
145+
return b
146+
}
58147
```
59148

60149
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution {
2+
public:
3+
int constrainedSubsetSum(vector<int>& nums, int k) {
4+
int n = nums.size();
5+
vector<int> dp(n);
6+
int ans = INT_MIN;
7+
deque<int> q;
8+
for (int i = 0; i < n; ++i)
9+
{
10+
if (!q.empty() && i - q.front() > k) q.pop_front();
11+
dp[i] = max(0, q.empty() ? 0 : dp[q.front()]) + nums[i];
12+
ans = max(ans, dp[i]);
13+
while (!q.empty() && dp[q.back()] <= dp[i]) q.pop_back();
14+
q.push_back(i);
15+
}
16+
return ans;
17+
}
18+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
func constrainedSubsetSum(nums []int, k int) int {
2+
n := len(nums)
3+
dp := make([]int, n)
4+
ans := math.MinInt32
5+
q := []int{}
6+
for i, v := range nums {
7+
if len(q) > 0 && i-q[0] > k {
8+
q = q[1:]
9+
}
10+
dp[i] = v
11+
if len(q) > 0 && dp[q[0]] > 0 {
12+
dp[i] += dp[q[0]]
13+
}
14+
for len(q) > 0 && dp[q[len(q)-1]] < dp[i] {
15+
q = q[:len(q)-1]
16+
}
17+
q = append(q, i)
18+
ans = max(ans, dp[i])
19+
}
20+
return ans
21+
}
22+
23+
func max(a, b int) int {
24+
if a > b {
25+
return a
26+
}
27+
return b
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public int constrainedSubsetSum(int[] nums, int k) {
3+
int n = nums.length;
4+
int[] dp = new int[n];
5+
int ans = Integer.MIN_VALUE;
6+
Deque<Integer> q = new ArrayDeque<>();
7+
for (int i = 0; i < n; ++i) {
8+
if (!q.isEmpty() && i - q.peek() > k) {
9+
q.poll();
10+
}
11+
dp[i] = Math.max(0, q.isEmpty() ? 0 : dp[q.peek()]) + nums[i];
12+
while (!q.isEmpty() && dp[q.peekLast()] <= dp[i]) {
13+
q.pollLast();
14+
}
15+
q.offer(i);
16+
ans = Math.max(ans, dp[i]);
17+
}
18+
return ans;
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution:
2+
def constrainedSubsetSum(self, nums: List[int], k: int) -> int:
3+
n = len(nums)
4+
dp = [0] * n
5+
ans = float('-inf')
6+
q = deque()
7+
for i, v in enumerate(nums):
8+
if q and i - q[0] > k:
9+
q.popleft()
10+
dp[i] = max(0, 0 if not q else dp[q[0]]) + v
11+
while q and dp[q[-1]] <= dp[i]:
12+
q.pop()
13+
q.append(i)
14+
ans = max(ans, dp[i])
15+
return ans

0 commit comments

Comments
 (0)