File tree Expand file tree Collapse file tree 7 files changed +270
-3
lines changed
0940.Distinct Subsequences II Expand file tree Collapse file tree 7 files changed +270
-3
lines changed Original file line number Diff line number Diff line change 63
63
64
64
最后,我们需要对 $dp$ 中的所有元素求和,再对 $10^9+7$ 取余,即为答案。
65
65
66
- 时间复杂度 $O(n\times C)$,其中 $n$ 是字符串 $s$ 的长度,$C$ 是字符集的大小,本题中 $C=26$。空间复杂度 $O(C)$。
66
+ 时间复杂度 $O(n\times C)$,其中 $n$ 是字符串 $s$ 的长度,而 $C$ 是字符集的大小,本题中 $C=26$。空间复杂度 $O(C)$。
67
67
68
68
** 方法二:优化的动态规划**
69
69
Original file line number Diff line number Diff line change 62
62
63
63
<!-- 这里可写通用的实现逻辑 -->
64
64
65
+ ** 方法一:贪心 + 排序 + 双指针**
66
+
67
+ 令牌的使用方法有两种,一种是消耗能量得到分数,一种是消耗分数得到能量。显然,我们应该消耗尽可能少的能量来得到尽可能多的分数。
68
+
69
+ 因此,我们可以将令牌按照消耗能量的多少进行排序,然后使用双指针,一个指针从左向右遍历,一个指针从右向左遍历,每次遍历都尽可能地消耗能量得到分数,然后更新最大分数。如果当前能量不足以消耗当前令牌,那么我们就尝试使用分数来消耗当前令牌,如果分数不足以消耗当前令牌,那么我们就停止遍历。
70
+
71
+ 时间复杂度 $O(n\log n)$,空间复杂度 $O(n)$。其中 $n$ 为令牌的数量。
72
+
65
73
<!-- tabs:start -->
66
74
67
75
### ** Python3**
68
76
69
77
<!-- 这里可写当前语言的特殊实现逻辑 -->
70
78
71
79
``` python
72
-
80
+ class Solution :
81
+ def bagOfTokensScore (self , tokens : List[int ], power : int ) -> int :
82
+ tokens.sort()
83
+ i, j = 0 , len (tokens) - 1
84
+ ans = t = 0
85
+ while i <= j:
86
+ if power >= tokens[i]:
87
+ power -= tokens[i]
88
+ i, t = i + 1 , t + 1
89
+ ans = max (ans, t)
90
+ elif t:
91
+ power += tokens[j]
92
+ j, t = j - 1 , t - 1
93
+ else :
94
+ break
95
+ return ans
73
96
```
74
97
75
98
### ** Java**
76
99
77
100
<!-- 这里可写当前语言的特殊实现逻辑 -->
78
101
79
102
``` java
103
+ class Solution {
104
+ public int bagOfTokensScore (int [] tokens , int power ) {
105
+ Arrays . sort(tokens);
106
+ int i = 0 , j = tokens. length - 1 ;
107
+ int ans = 0 , t = 0 ;
108
+ while (i <= j) {
109
+ if (power >= tokens[i]) {
110
+ power -= tokens[i++ ];
111
+ ++ t;
112
+ ans = Math . max(ans, t);
113
+ } else if (t > 0 ) {
114
+ power += tokens[j-- ];
115
+ -- t;
116
+ } else {
117
+ break ;
118
+ }
119
+ }
120
+ return ans;
121
+ }
122
+ }
123
+ ```
124
+
125
+ ### ** C++**
126
+
127
+ ``` cpp
128
+ class Solution {
129
+ public:
130
+ int bagOfTokensScore(vector<int >& tokens, int power) {
131
+ sort(tokens.begin(), tokens.end());
132
+ int i = 0, j = tokens.size() - 1;
133
+ int ans = 0, t = 0;
134
+ while (i <= j) {
135
+ if (power >= tokens[ i] ) {
136
+ power -= tokens[ i++] ;
137
+ ans = max(ans, ++t);
138
+ } else if (t) {
139
+ power += tokens[ j--] ;
140
+ --t;
141
+ } else {
142
+ break;
143
+ }
144
+ }
145
+ return ans;
146
+ }
147
+ };
148
+ ```
80
149
150
+ ### **Go**
151
+
152
+ ```go
153
+ func bagOfTokensScore(tokens []int, power int) int {
154
+ sort.Ints(tokens)
155
+ i, j := 0, len(tokens)-1
156
+ ans, t := 0, 0
157
+ for i <= j {
158
+ if power >= tokens[i] {
159
+ power -= tokens[i]
160
+ i, t = i+1, t+1
161
+ ans = max(ans, t)
162
+ } else if t > 0 {
163
+ power += tokens[j]
164
+ j, t = j-1, t-1
165
+ } else {
166
+ break
167
+ }
168
+ }
169
+ return ans
170
+ }
171
+
172
+ func max(a, b int) int {
173
+ if a > b {
174
+ return a
175
+ }
176
+ return b
177
+ }
81
178
```
82
179
83
180
### ** ...**
Original file line number Diff line number Diff line change @@ -62,13 +62,102 @@ There is no need to play the 1<sup>st</sup> token since you cannot play it face
62
62
### ** Python3**
63
63
64
64
``` python
65
-
65
+ class Solution :
66
+ def bagOfTokensScore (self , tokens : List[int ], power : int ) -> int :
67
+ tokens.sort()
68
+ i, j = 0 , len (tokens) - 1
69
+ ans = t = 0
70
+ while i <= j:
71
+ if power >= tokens[i]:
72
+ power -= tokens[i]
73
+ i, t = i + 1 , t + 1
74
+ ans = max (ans, t)
75
+ elif t:
76
+ power += tokens[j]
77
+ j, t = j - 1 , t - 1
78
+ else :
79
+ break
80
+ return ans
66
81
```
67
82
68
83
### ** Java**
69
84
70
85
``` java
86
+ class Solution {
87
+ public int bagOfTokensScore (int [] tokens , int power ) {
88
+ Arrays . sort(tokens);
89
+ int i = 0 , j = tokens. length - 1 ;
90
+ int ans = 0 , t = 0 ;
91
+ while (i <= j) {
92
+ if (power >= tokens[i]) {
93
+ power -= tokens[i++ ];
94
+ ++ t;
95
+ ans = Math . max(ans, t);
96
+ } else if (t > 0 ) {
97
+ power += tokens[j-- ];
98
+ -- t;
99
+ } else {
100
+ break ;
101
+ }
102
+ }
103
+ return ans;
104
+ }
105
+ }
106
+ ```
107
+
108
+ ### ** C++**
109
+
110
+ ``` cpp
111
+ class Solution {
112
+ public:
113
+ int bagOfTokensScore(vector<int >& tokens, int power) {
114
+ sort(tokens.begin(), tokens.end());
115
+ int i = 0, j = tokens.size() - 1;
116
+ int ans = 0, t = 0;
117
+ while (i <= j) {
118
+ if (power >= tokens[ i] ) {
119
+ power -= tokens[ i++] ;
120
+ ans = max(ans, ++t);
121
+ } else if (t) {
122
+ power += tokens[ j--] ;
123
+ --t;
124
+ } else {
125
+ break;
126
+ }
127
+ }
128
+ return ans;
129
+ }
130
+ };
131
+ ```
71
132
133
+ ### **Go**
134
+
135
+ ```go
136
+ func bagOfTokensScore(tokens []int, power int) int {
137
+ sort.Ints(tokens)
138
+ i, j := 0, len(tokens)-1
139
+ ans, t := 0, 0
140
+ for i <= j {
141
+ if power >= tokens[i] {
142
+ power -= tokens[i]
143
+ i, t = i+1, t+1
144
+ ans = max(ans, t)
145
+ } else if t > 0 {
146
+ power += tokens[j]
147
+ j, t = j-1, t-1
148
+ } else {
149
+ break
150
+ }
151
+ }
152
+ return ans
153
+ }
154
+
155
+ func max(a, b int) int {
156
+ if a > b {
157
+ return a
158
+ }
159
+ return b
160
+ }
72
161
```
73
162
74
163
### ** ...**
Original file line number Diff line number Diff line change
1
+ class Solution {
2
+ public:
3
+ int bagOfTokensScore (vector<int >& tokens, int power) {
4
+ sort (tokens.begin (), tokens.end ());
5
+ int i = 0 , j = tokens.size () - 1 ;
6
+ int ans = 0 , t = 0 ;
7
+ while (i <= j) {
8
+ if (power >= tokens[i]) {
9
+ power -= tokens[i++];
10
+ ans = max (ans, ++t);
11
+ } else if (t) {
12
+ power += tokens[j--];
13
+ --t;
14
+ } else {
15
+ break ;
16
+ }
17
+ }
18
+ return ans;
19
+ }
20
+ };
Original file line number Diff line number Diff line change
1
+ func bagOfTokensScore (tokens []int , power int ) int {
2
+ sort .Ints (tokens )
3
+ i , j := 0 , len (tokens )- 1
4
+ ans , t := 0 , 0
5
+ for i <= j {
6
+ if power >= tokens [i ] {
7
+ power -= tokens [i ]
8
+ i , t = i + 1 , t + 1
9
+ ans = max (ans , t )
10
+ } else if t > 0 {
11
+ power += tokens [j ]
12
+ j , t = j - 1 , t - 1
13
+ } else {
14
+ break
15
+ }
16
+ }
17
+ return ans
18
+ }
19
+
20
+ func max (a , b int ) int {
21
+ if a > b {
22
+ return a
23
+ }
24
+ return b
25
+ }
Original file line number Diff line number Diff line change
1
+ class Solution {
2
+ public int bagOfTokensScore (int [] tokens , int power ) {
3
+ Arrays .sort (tokens );
4
+ int i = 0 , j = tokens .length - 1 ;
5
+ int ans = 0 , t = 0 ;
6
+ while (i <= j ) {
7
+ if (power >= tokens [i ]) {
8
+ power -= tokens [i ++];
9
+ ++t ;
10
+ ans = Math .max (ans , t );
11
+ } else if (t > 0 ) {
12
+ power += tokens [j --];
13
+ --t ;
14
+ } else {
15
+ break ;
16
+ }
17
+ }
18
+ return ans ;
19
+ }
20
+ }
Original file line number Diff line number Diff line change
1
+ class Solution :
2
+ def bagOfTokensScore (self , tokens : List [int ], power : int ) -> int :
3
+ tokens .sort ()
4
+ i , j = 0 , len (tokens ) - 1
5
+ ans = t = 0
6
+ while i <= j :
7
+ if power >= tokens [i ]:
8
+ power -= tokens [i ]
9
+ i , t = i + 1 , t + 1
10
+ ans = max (ans , t )
11
+ elif t :
12
+ power += tokens [j ]
13
+ j , t = j - 1 , t - 1
14
+ else :
15
+ break
16
+ return ans
You can’t perform that action at this time.
0 commit comments