Skip to content

Commit 5d86c0f

Browse files
committed
feat: add solutions to lc problem: No.0948
No.0948.Bag of Tokens
1 parent f52bedc commit 5d86c0f

File tree

7 files changed

+270
-3
lines changed

7 files changed

+270
-3
lines changed

solution/0900-0999/0940.Distinct Subsequences II/README.md

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

6464
最后,我们需要对 $dp$ 中的所有元素求和,再对 $10^9+7$ 取余,即为答案。
6565

66-
时间复杂度 $O(n\times C)$,其中 $n$ 是字符串 $s$ 的长度,$C$ 是字符集的大小,本题中 $C=26$。空间复杂度 $O(C)$。
66+
时间复杂度 $O(n\times C)$,其中 $n$ 是字符串 $s$ 的长度,$C$ 是字符集的大小,本题中 $C=26$。空间复杂度 $O(C)$。
6767

6868
**方法二:优化的动态规划**
6969

solution/0900-0999/0948.Bag of Tokens/README.md

Lines changed: 98 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,22 +62,119 @@
6262

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

65+
**方法一:贪心 + 排序 + 双指针**
66+
67+
令牌的使用方法有两种,一种是消耗能量得到分数,一种是消耗分数得到能量。显然,我们应该消耗尽可能少的能量来得到尽可能多的分数。
68+
69+
因此,我们可以将令牌按照消耗能量的多少进行排序,然后使用双指针,一个指针从左向右遍历,一个指针从右向左遍历,每次遍历都尽可能地消耗能量得到分数,然后更新最大分数。如果当前能量不足以消耗当前令牌,那么我们就尝试使用分数来消耗当前令牌,如果分数不足以消耗当前令牌,那么我们就停止遍历。
70+
71+
时间复杂度 $O(n\log n)$,空间复杂度 $O(n)$。其中 $n$ 为令牌的数量。
72+
6573
<!-- tabs:start -->
6674

6775
### **Python3**
6876

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

7179
```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
7396
```
7497

7598
### **Java**
7699

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

79102
```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+
```
80149
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+
}
81178
```
82179

83180
### **...**

solution/0900-0999/0948.Bag of Tokens/README_EN.md

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,102 @@ There is no need to play the 1<sup>st</sup> token since you cannot play it face
6262
### **Python3**
6363

6464
```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
6681
```
6782

6883
### **Java**
6984

7085
```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+
```
71132
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+
}
72161
```
73162

74163
### **...**
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
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+
};
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
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+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
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+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
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

0 commit comments

Comments
 (0)