Skip to content

Commit 3deebd5

Browse files
committed
feat: add solutions to lc problem: No.1498
No.1498.Number of Subsequences That Satisfy the Given Sum Condition
1 parent 922d776 commit 3deebd5

File tree

6 files changed

+293
-2
lines changed

6 files changed

+293
-2
lines changed

solution/1400-1499/1498.Number of Subsequences That Satisfy the Given Sum Condition/README.md

Lines changed: 106 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,22 +57,127 @@
5757

5858
<!-- 这里可写通用的实现逻辑 -->
5959

60+
**方法一:排序 + 枚举贡献 + 二分查找**
61+
62+
由于题目中描述的是子序列,并且涉及到最小元素与最大元素的和,因此我们可以先对数组 `nums` 进行排序。
63+
64+
然后我们枚举最小元素 $nums[i]$,对于每个 $nums[i]$,我们可以在 $nums[i + 1]$ 到 $nums[n - 1]$ 中找到最大元素 $nums[j]$,使得 $nums[i] + nums[j] \leq target$,此时满足条件的子序列数目为 $2^{j - i}$,其中 $2^{j - i}$ 表示从 $nums[i + 1]$ 到 $nums[j]$ 的所有子序列的数目。我们将所有的子序列数目累加即可。
65+
66+
时间复杂度 $O(n \times \log n)$,空间复杂度 $O(n)$。其中 $n$ 为数组 `nums` 的长度。
67+
6068
<!-- tabs:start -->
6169

6270
### **Python3**
6371

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

6674
```python
67-
75+
class Solution:
76+
def numSubseq(self, nums: List[int], target: int) -> int:
77+
mod = 10**9 + 7
78+
nums.sort()
79+
n = len(nums)
80+
f = [1] + [0] * n
81+
for i in range(1, n + 1):
82+
f[i] = f[i - 1] * 2 % mod
83+
ans = 0
84+
for i, x in enumerate(nums):
85+
if x * 2 > target:
86+
break
87+
j = bisect_right(nums, target - x, i + 1) - 1
88+
ans = (ans + f[j - i]) % mod
89+
return ans
6890
```
6991

7092
### **Java**
7193

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

7496
```java
97+
class Solution {
98+
public int numSubseq(int[] nums, int target) {
99+
Arrays.sort(nums);
100+
final int mod = (int) 1e9 + 7;
101+
int n = nums.length;
102+
int[] f = new int[n + 1];
103+
f[0] = 1;
104+
for (int i = 1; i <= n; ++i) {
105+
f[i] = (f[i - 1] * 2) % mod;
106+
}
107+
int ans = 0;
108+
for (int i = 0; i < n; ++i) {
109+
if (nums[i] * 2L > target) {
110+
break;
111+
}
112+
int j = search(nums, target - nums[i], i + 1) - 1;
113+
ans = (ans + f[j - i]) % mod;
114+
}
115+
return ans;
116+
}
117+
118+
private int search(int[] nums, int x, int left) {
119+
int right = nums.length;
120+
while (left < right) {
121+
int mid = (left + right) >> 1;
122+
if (nums[mid] > x) {
123+
right = mid;
124+
} else {
125+
left = mid + 1;
126+
}
127+
}
128+
return left;
129+
}
130+
}
131+
```
132+
133+
### **C++**
134+
135+
```cpp
136+
class Solution {
137+
public:
138+
int numSubseq(vector<int>& nums, int target) {
139+
sort(nums.begin(), nums.end());
140+
const int mod = 1e9 + 7;
141+
int n = nums.size();
142+
int f[n + 1];
143+
f[0] = 1;
144+
for (int i = 1; i <= n; ++i) {
145+
f[i] = (f[i - 1] * 2) % mod;
146+
}
147+
int ans = 0;
148+
for (int i = 0; i < n; ++i) {
149+
if (nums[i] * 2L > target) {
150+
break;
151+
}
152+
int j = upper_bound(nums.begin() + i + 1, nums.end(), target - nums[i]) - nums.begin() - 1;
153+
ans = (ans + f[j - i]) % mod;
154+
}
155+
return ans;
156+
}
157+
};
158+
```
75159
160+
### **Go**
161+
162+
```go
163+
func numSubseq(nums []int, target int) (ans int) {
164+
sort.Ints(nums)
165+
n := len(nums)
166+
f := make([]int, n+1)
167+
f[0] = 1
168+
const mod int = 1e9 + 7
169+
for i := 1; i <= n; i++ {
170+
f[i] = f[i-1] * 2 % mod
171+
}
172+
for i, x := range nums {
173+
if x*2 > target {
174+
break
175+
}
176+
j := sort.SearchInts(nums[i+1:], target-x+1) + i
177+
ans = (ans + f[j-i]) % mod
178+
}
179+
return
180+
}
76181
```
77182

78183
### **...**

solution/1400-1499/1498.Number of Subsequences That Satisfy the Given Sum Condition/README_EN.md

Lines changed: 98 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,110 @@ Number of valid subsequences (63 - 2 = 61).
5555
### **Python3**
5656

5757
```python
58-
58+
class Solution:
59+
def numSubseq(self, nums: List[int], target: int) -> int:
60+
mod = 10**9 + 7
61+
nums.sort()
62+
n = len(nums)
63+
f = [1] + [0] * n
64+
for i in range(1, n + 1):
65+
f[i] = f[i - 1] * 2 % mod
66+
ans = 0
67+
for i, x in enumerate(nums):
68+
if x * 2 > target:
69+
break
70+
j = bisect_right(nums, target - x, i + 1) - 1
71+
ans = (ans + f[j - i]) % mod
72+
return ans
5973
```
6074

6175
### **Java**
6276

6377
```java
78+
class Solution {
79+
public int numSubseq(int[] nums, int target) {
80+
Arrays.sort(nums);
81+
final int mod = (int) 1e9 + 7;
82+
int n = nums.length;
83+
int[] f = new int[n + 1];
84+
f[0] = 1;
85+
for (int i = 1; i <= n; ++i) {
86+
f[i] = (f[i - 1] * 2) % mod;
87+
}
88+
int ans = 0;
89+
for (int i = 0; i < n; ++i) {
90+
if (nums[i] * 2L > target) {
91+
break;
92+
}
93+
int j = search(nums, target - nums[i], i + 1) - 1;
94+
ans = (ans + f[j - i]) % mod;
95+
}
96+
return ans;
97+
}
98+
99+
private int search(int[] nums, int x, int left) {
100+
int right = nums.length;
101+
while (left < right) {
102+
int mid = (left + right) >> 1;
103+
if (nums[mid] > x) {
104+
right = mid;
105+
} else {
106+
left = mid + 1;
107+
}
108+
}
109+
return left;
110+
}
111+
}
112+
```
113+
114+
### **C++**
115+
116+
```cpp
117+
class Solution {
118+
public:
119+
int numSubseq(vector<int>& nums, int target) {
120+
sort(nums.begin(), nums.end());
121+
const int mod = 1e9 + 7;
122+
int n = nums.size();
123+
int f[n + 1];
124+
f[0] = 1;
125+
for (int i = 1; i <= n; ++i) {
126+
f[i] = (f[i - 1] * 2) % mod;
127+
}
128+
int ans = 0;
129+
for (int i = 0; i < n; ++i) {
130+
if (nums[i] * 2L > target) {
131+
break;
132+
}
133+
int j = upper_bound(nums.begin() + i + 1, nums.end(), target - nums[i]) - nums.begin() - 1;
134+
ans = (ans + f[j - i]) % mod;
135+
}
136+
return ans;
137+
}
138+
};
139+
```
64140
141+
### **Go**
142+
143+
```go
144+
func numSubseq(nums []int, target int) (ans int) {
145+
sort.Ints(nums)
146+
n := len(nums)
147+
f := make([]int, n+1)
148+
f[0] = 1
149+
const mod int = 1e9 + 7
150+
for i := 1; i <= n; i++ {
151+
f[i] = f[i-1] * 2 % mod
152+
}
153+
for i, x := range nums {
154+
if x*2 > target {
155+
break
156+
}
157+
j := sort.SearchInts(nums[i+1:], target-x+1) + i
158+
ans = (ans + f[j-i]) % mod
159+
}
160+
return
161+
}
65162
```
66163

67164
### **...**
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution {
2+
public:
3+
int numSubseq(vector<int>& nums, int target) {
4+
sort(nums.begin(), nums.end());
5+
const int mod = 1e9 + 7;
6+
int n = nums.size();
7+
int f[n + 1];
8+
f[0] = 1;
9+
for (int i = 1; i <= n; ++i) {
10+
f[i] = (f[i - 1] * 2) % mod;
11+
}
12+
int ans = 0;
13+
for (int i = 0; i < n; ++i) {
14+
if (nums[i] * 2L > target) {
15+
break;
16+
}
17+
int j = upper_bound(nums.begin() + i + 1, nums.end(), target - nums[i]) - nums.begin() - 1;
18+
ans = (ans + f[j - i]) % mod;
19+
}
20+
return ans;
21+
}
22+
};
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
func numSubseq(nums []int, target int) (ans int) {
2+
sort.Ints(nums)
3+
n := len(nums)
4+
f := make([]int, n+1)
5+
f[0] = 1
6+
const mod int = 1e9 + 7
7+
for i := 1; i <= n; i++ {
8+
f[i] = f[i-1] * 2 % mod
9+
}
10+
for i, x := range nums {
11+
if x*2 > target {
12+
break
13+
}
14+
j := sort.SearchInts(nums[i+1:], target-x+1) + i
15+
ans = (ans + f[j-i]) % mod
16+
}
17+
return
18+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
class Solution {
2+
public int numSubseq(int[] nums, int target) {
3+
Arrays.sort(nums);
4+
final int mod = (int) 1e9 + 7;
5+
int n = nums.length;
6+
int[] f = new int[n + 1];
7+
f[0] = 1;
8+
for (int i = 1; i <= n; ++i) {
9+
f[i] = (f[i - 1] * 2) % mod;
10+
}
11+
int ans = 0;
12+
for (int i = 0; i < n; ++i) {
13+
if (nums[i] * 2L > target) {
14+
break;
15+
}
16+
int j = search(nums, target - nums[i], i + 1) - 1;
17+
ans = (ans + f[j - i]) % mod;
18+
}
19+
return ans;
20+
}
21+
22+
private int search(int[] nums, int x, int left) {
23+
int right = nums.length;
24+
while (left < right) {
25+
int mid = (left + right) >> 1;
26+
if (nums[mid] > x) {
27+
right = mid;
28+
} else {
29+
left = mid + 1;
30+
}
31+
}
32+
return left;
33+
}
34+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution:
2+
def numSubseq(self, nums: List[int], target: int) -> int:
3+
mod = 10**9 + 7
4+
nums.sort()
5+
n = len(nums)
6+
f = [1] + [0] * n
7+
for i in range(1, n + 1):
8+
f[i] = f[i - 1] * 2 % mod
9+
ans = 0
10+
for i, x in enumerate(nums):
11+
if x * 2 > target:
12+
break
13+
j = bisect_right(nums, target - x, i + 1) - 1
14+
ans = (ans + f[j - i]) % mod
15+
return ans

0 commit comments

Comments
 (0)