Skip to content

Commit 17411a2

Browse files
committed
feat: add solutions to lc problem: No.0135
No.0135.Candy
1 parent 76ff30a commit 17411a2

File tree

8 files changed

+424
-62
lines changed

8 files changed

+424
-62
lines changed

solution/0100-0199/0135.Candy/README.md

+160-1
Original file line numberDiff line numberDiff line change
@@ -49,22 +49,181 @@
4949

5050
<!-- 这里可写通用的实现逻辑 -->
5151

52+
**方法一:两次遍历**
53+
54+
两次遍历数组。
55+
56+
第一次从左到右遍历,如果当前孩子的评分比左边孩子高,则当前孩子的糖果数比左边孩子的糖果数多 1,即 $left[i]=left[i-1]+1$,否则 $left[i]=1$;
57+
58+
第二次从右到左遍历,如果当前孩子的评分比右边孩子高,则当前孩子的糖果数比右边孩子的糖果数多 1,即 $right[i]=right[i+1]+1$,否则 $right[i]=1$。
59+
60+
最后,每个孩子的糖果数为 $left[i]$ 和 $right[i]$ 的最大值,即 $max(left[i],right[i])$。累加每个孩子的糖果数,即为最少糖果数。
61+
62+
时间复杂度为 $O(n)$,空间复杂度为 $O(n)$。其中 $n$ 为数组 `ratings` 的长度。
63+
5264
<!-- tabs:start -->
5365

5466
### **Python3**
5567

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

5870
```python
59-
71+
class Solution:
72+
def candy(self, ratings: List[int]) -> int:
73+
n = len(ratings)
74+
left = [1] * n
75+
right = [1] * n
76+
for i in range(1, n):
77+
if ratings[i] > ratings[i - 1]:
78+
left[i] = left[i - 1] + 1
79+
for i in range(n - 2, -1, -1):
80+
if ratings[i] > ratings[i + 1]:
81+
right[i] = right[i + 1] + 1
82+
return sum(max(a, b) for a, b in zip(left, right))
6083
```
6184

6285
### **Java**
6386

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

6689
```java
90+
class Solution {
91+
public int candy(int[] ratings) {
92+
int n = ratings.length;
93+
int[] left = new int[n];
94+
int[] right = new int[n];
95+
Arrays.fill(left, 1);
96+
Arrays.fill(right, 1);
97+
for (int i = 1; i < n; ++i) {
98+
if (ratings[i] > ratings[i - 1]) {
99+
left[i] = left[i - 1] + 1;
100+
}
101+
}
102+
for (int i = n - 2; i >= 0; --i) {
103+
if (ratings[i] > ratings[i + 1]) {
104+
right[i] = right[i + 1] + 1;
105+
}
106+
}
107+
int ans = 0;
108+
for (int i = 0; i < n; ++i) {
109+
ans += Math.max(left[i], right[i]);
110+
}
111+
return ans;
112+
}
113+
}
114+
```
115+
116+
### **C++**
117+
118+
```cpp
119+
class Solution {
120+
public:
121+
int candy(vector<int>& ratings) {
122+
int n = ratings.size();
123+
vector<int> left(n, 1);
124+
vector<int> right(n, 1);
125+
for (int i = 1; i < n; ++i) {
126+
if (ratings[i] > ratings[i - 1]) {
127+
left[i] = left[i - 1] + 1;
128+
}
129+
}
130+
for (int i = n - 2; ~i; --i) {
131+
if (ratings[i] > ratings[i + 1]) {
132+
right[i] = right[i + 1] + 1;
133+
}
134+
}
135+
int ans = 0;
136+
for (int i = 0; i < n; ++i) {
137+
ans += max(left[i], right[i]);
138+
}
139+
return ans;
140+
}
141+
};
142+
```
143+
144+
### **Go**
145+
146+
```go
147+
func candy(ratings []int) int {
148+
n := len(ratings)
149+
left := make([]int, n)
150+
right := make([]int, n)
151+
for i := range left {
152+
left[i] = 1
153+
right[i] = 1
154+
}
155+
for i := 1; i < n; i++ {
156+
if ratings[i] > ratings[i-1] {
157+
left[i] = left[i-1] + 1
158+
}
159+
}
160+
for i := n - 2; i >= 0; i-- {
161+
if ratings[i] > ratings[i+1] {
162+
right[i] = right[i+1] + 1
163+
}
164+
}
165+
ans := 0
166+
for i, a := range left {
167+
b := right[i]
168+
ans += max(a, b)
169+
}
170+
return ans
171+
}
172+
173+
func max(a, b int) int {
174+
if a > b {
175+
return a
176+
}
177+
return b
178+
}
179+
```
180+
181+
### **TypeScript**
182+
183+
```ts
184+
function candy(ratings: number[]): number {
185+
const n = ratings.length;
186+
const left = new Array(n).fill(1);
187+
const right = new Array(n).fill(1);
188+
for (let i = 1; i < n; ++i) {
189+
if (ratings[i] > ratings[i - 1]) {
190+
left[i] = left[i - 1] + 1;
191+
}
192+
}
193+
for (let i = n - 2; i >= 0; --i) {
194+
if (ratings[i] > ratings[i + 1]) {
195+
right[i] = right[i + 1] + 1;
196+
}
197+
}
198+
let ans = 0;
199+
for (let i = 0; i < n; ++i) {
200+
ans += Math.max(left[i], right[i]);
201+
}
202+
return ans;
203+
}
204+
```
67205

206+
### **C#**
207+
208+
```cs
209+
public class Solution {
210+
public int Candy(int[] ratings) {
211+
int n = ratings.Length;
212+
int[] candies = new int[n];
213+
Array.Fill(candies, 1);
214+
for (int i = 1; i < n; ++i) {
215+
if (ratings[i] > ratings[i - 1]) {
216+
candies[i] = candies[i - 1] + 1;
217+
}
218+
}
219+
for (int i = n - 2; i >= 0; --i) {
220+
if (ratings[i] > ratings[i + 1]) {
221+
candies[i] = Math.Max(candies[i], candies[i + 1] + 1);
222+
}
223+
}
224+
return candies.Sum();
225+
}
226+
}
68227
```
69228

70229
### **...**

solution/0100-0199/0135.Candy/README_EN.md

+148-1
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,160 @@ The third child gets 1 candy because it satisfies the above two conditions.
4949
### **Python3**
5050

5151
```python
52-
52+
class Solution:
53+
def candy(self, ratings: List[int]) -> int:
54+
n = len(ratings)
55+
left = [1] * n
56+
right = [1] * n
57+
for i in range(1, n):
58+
if ratings[i] > ratings[i - 1]:
59+
left[i] = left[i - 1] + 1
60+
for i in range(n - 2, -1, -1):
61+
if ratings[i] > ratings[i + 1]:
62+
right[i] = right[i + 1] + 1
63+
return sum(max(a, b) for a, b in zip(left, right))
5364
```
5465

5566
### **Java**
5667

5768
```java
69+
class Solution {
70+
public int candy(int[] ratings) {
71+
int n = ratings.length;
72+
int[] left = new int[n];
73+
int[] right = new int[n];
74+
Arrays.fill(left, 1);
75+
Arrays.fill(right, 1);
76+
for (int i = 1; i < n; ++i) {
77+
if (ratings[i] > ratings[i - 1]) {
78+
left[i] = left[i - 1] + 1;
79+
}
80+
}
81+
for (int i = n - 2; i >= 0; --i) {
82+
if (ratings[i] > ratings[i + 1]) {
83+
right[i] = right[i + 1] + 1;
84+
}
85+
}
86+
int ans = 0;
87+
for (int i = 0; i < n; ++i) {
88+
ans += Math.max(left[i], right[i]);
89+
}
90+
return ans;
91+
}
92+
}
93+
```
94+
95+
### **C++**
96+
97+
```cpp
98+
class Solution {
99+
public:
100+
int candy(vector<int>& ratings) {
101+
int n = ratings.size();
102+
vector<int> left(n, 1);
103+
vector<int> right(n, 1);
104+
for (int i = 1; i < n; ++i) {
105+
if (ratings[i] > ratings[i - 1]) {
106+
left[i] = left[i - 1] + 1;
107+
}
108+
}
109+
for (int i = n - 2; ~i; --i) {
110+
if (ratings[i] > ratings[i + 1]) {
111+
right[i] = right[i + 1] + 1;
112+
}
113+
}
114+
int ans = 0;
115+
for (int i = 0; i < n; ++i) {
116+
ans += max(left[i], right[i]);
117+
}
118+
return ans;
119+
}
120+
};
121+
```
122+
123+
### **Go**
124+
125+
```go
126+
func candy(ratings []int) int {
127+
n := len(ratings)
128+
left := make([]int, n)
129+
right := make([]int, n)
130+
for i := range left {
131+
left[i] = 1
132+
right[i] = 1
133+
}
134+
for i := 1; i < n; i++ {
135+
if ratings[i] > ratings[i-1] {
136+
left[i] = left[i-1] + 1
137+
}
138+
}
139+
for i := n - 2; i >= 0; i-- {
140+
if ratings[i] > ratings[i+1] {
141+
right[i] = right[i+1] + 1
142+
}
143+
}
144+
ans := 0
145+
for i, a := range left {
146+
b := right[i]
147+
ans += max(a, b)
148+
}
149+
return ans
150+
}
151+
152+
func max(a, b int) int {
153+
if a > b {
154+
return a
155+
}
156+
return b
157+
}
158+
```
159+
160+
### **TypeScript**
161+
162+
```ts
163+
function candy(ratings: number[]): number {
164+
const n = ratings.length;
165+
const left = new Array(n).fill(1);
166+
const right = new Array(n).fill(1);
167+
for (let i = 1; i < n; ++i) {
168+
if (ratings[i] > ratings[i - 1]) {
169+
left[i] = left[i - 1] + 1;
170+
}
171+
}
172+
for (let i = n - 2; i >= 0; --i) {
173+
if (ratings[i] > ratings[i + 1]) {
174+
right[i] = right[i + 1] + 1;
175+
}
176+
}
177+
let ans = 0;
178+
for (let i = 0; i < n; ++i) {
179+
ans += Math.max(left[i], right[i]);
180+
}
181+
return ans;
182+
}
183+
```
58184

185+
### **C#**
186+
187+
```cs
188+
public class Solution {
189+
public int Candy(int[] ratings) {
190+
int n = ratings.Length;
191+
int[] candies = new int[n];
192+
Array.Fill(candies, 1);
193+
for (int i = 1; i < n; ++i) {
194+
if (ratings[i] > ratings[i - 1]) {
195+
candies[i] = candies[i - 1] + 1;
196+
}
197+
}
198+
for (int i = n - 2; i >= 0; --i) {
199+
if (ratings[i] > ratings[i + 1]) {
200+
candies[i] = Math.Max(candies[i], candies[i + 1] + 1);
201+
}
202+
}
203+
return candies.Sum();
204+
}
205+
}
59206
```
60207

61208
### **...**
+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
public:
3+
int candy(vector<int>& ratings) {
4+
int n = ratings.size();
5+
vector<int> left(n, 1);
6+
vector<int> right(n, 1);
7+
for (int i = 1; i < n; ++i) {
8+
if (ratings[i] > ratings[i - 1]) {
9+
left[i] = left[i - 1] + 1;
10+
}
11+
}
12+
for (int i = n - 2; ~i; --i) {
13+
if (ratings[i] > ratings[i + 1]) {
14+
right[i] = right[i + 1] + 1;
15+
}
16+
}
17+
int ans = 0;
18+
for (int i = 0; i < n; ++i) {
19+
ans += max(left[i], right[i]);
20+
}
21+
return ans;
22+
}
23+
};

0 commit comments

Comments
 (0)