Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Latest commit

 

History

History
History
86 lines (83 loc) · 2.69 KB

File metadata and controls

86 lines (83 loc) · 2.69 KB
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package problems;
/**
* 拆分为两个规则,分别处理。
* 左规则:当 ratings[i-1] < ratings[i] 时,i 号学生的糖果数量将比 i-1 号孩子的糖果数量多。
* 右规则:当 ratings[i] > ratings[i+1] 时,i 号学生的糖果数量将比 i+1 号孩子的糖果数量多。
* 具体地,以左规则为例:我们从左到右遍历该数组,假设当前遍历到位置 i,如果有 ratings[i - 1] < ratings[i] 那么 i 号学生的糖果数量将比 i−1 号孩子的糖果数量多,
* 我们令 left[i]=left[i−1]+1 即可,否则我们令 left[i]=1。
*
*/
public class LeetCode135 {
public int candy(int[] ratings) {
int n = ratings.length;
int[] left = new int[n];
for (int i = 0; i < n; i++) {
if (i > 0 && ratings[i] > ratings[i - 1]) {
left[i] = left[i - 1] + 1;
} else {
left[i] = 1;
}
}
int right = 0, ret = 0;
for (int i = n - 1; i >= 0; i--) {
if (i < n - 1 && ratings[i] > ratings[i + 1]) {
right++;
} else {
right = 1;
}
ret += Math.max(left[i], right);
}
return ret;
}
public int candy1(int[] ratings) {
int n = ratings.length;
int ret = 1;
int inc = 1, dec=0, pre = 1;
for (int i = 1; i < n; i++) {
if(ratings[i] >= ratings[i-1]){
dec = 0;
pre = ratings[i] == ratings[i-1] ? 1:pre+1;
ret +=pre;
inc = pre;
}else{
dec++;
if(dec == inc){
dec++;
}
ret += dec;
pre=1;
}
}
return ret;
}
}
class LeetCode135_1 {
/**
* 两次遍历
* 左规则:当 ratings[i - 1] < ratings[i] 时,i 号 糖果数量 > i - 1 号 糖果数量
* 右规则:当 ratings[i] > ratings[i + 1] 时,i 号 糖果数量 > i + 1 号 糖果数量
* @param ratings
* @return
*/
public int candy(int[] ratings) {
int n = ratings.length;
int[] left = new int[n];
for (int i = 0; i < n; i++) {
if(i > 0 && ratings[i] > ratings[i - 1]) {
left[i] = left[i - 1] + 1;
} else {
left[i] = 1;
}
}
int right = 0, ret = 0;
for (int i = n - 1; i >= 0; i--) {
if(i < n - 1 && ratings[i] > ratings[i + 1]) {
right ++;
} else {
right = 1;
}
ret += Math.max(left[i], right);
}
return ret;
}
}
Morty Proxy This is a proxified and sanitized view of the page, visit original site.