文章目录
6027. 统计数组中峰和谷的数量
题目
模拟
从索引i=2
开始遍历,
- 若
nums[i]==nums[i-1]
,则直接continue
- 否则每次从当前索引之前的数组中取出3个数
a,b,c
,不一定连续,例如假设原数组为[2,4,1,1,6,5]
,当前索引i=4
,那么取出的3个数分别为a=4,b=1,c=6
,但是这3个数的索引分别为[1,2,4]
,判断这3个数是否满足(b > a)&&(b >c)
或(b < a)&&(b < c)
class Solution {
public int countHillValley(int[] nums) {
int n = nums.length;
int res = 0;
for (int i = 2; i < n; i++) {
if (nums[i] == nums[i - 1]) {
continue ;
}
// 往前取 3 个数
int a = nums[i];
int j = i - 1;
while (j > 0 && nums[j] == nums[j - 1]) {
j--;
}
int b = nums[j--];
while (j > 0 && nums[j] == nums[j - 1]) {
j--;
}
// 防止 [1,1,4,6] 这种情况
if (j < 0) {
continue ;
}
int c = nums[j];
if ((b > a && b > c) || (b < a && b < c)) {
res++;
}
}
return res;
}
}
6028. 统计道路上的碰撞次数
题目
模拟 + 优先处理 向右
算法流程:
-
变量定义:定义两个
boolean
数组hasCar
和Lmoved
hasCar[i]=true
代表此处有静止的车辆,有可能是停留的车辆(s
)也有可能是碰撞后的车辆Lmoved
主要用于记录在优先处理向右的车辆的过程中,发生碰撞的向左车辆
-
遍历字符串,优先处理向右的车辆
- 如果
directions.charAt(i) != 'R'
,可直接continue
- 如果
directions.charAt(i) == 'R'
,继续向右遍历,直到碰到字符L
或S
- 若
directions.charAt(j) == 'L'
,代表[i, j-1]
区间内的R
都将发生碰撞,并停留在原地,碰撞次数增加(2 + (j - i - 1))
次,RL
碰撞次数+2
,剩余的j-i-1
个R
碰撞次数只+1
,Lmoved[j]=true
代表此L
已经处理过了 - 若
directions.charAt(j) == 'S'
,代表[i, j-1]
区间内的R
都将发生碰撞,并停留在原地,碰撞次数增加(j - i)
次 - 最后将
[i,j-1]
区间的hasCar
都设为true
- 若
- 如果
-
再次遍历字符串,只需处理向左的车辆
- 如果是最左边的车辆即
i==0
或者Lmved[i]==true
,可直接continue
- 若
hasCar[i-1]=true
,则碰撞次数+1
,并令hasCar[i]=true
代表会停留在原地
- 如果是最左边的车辆即
class Solution {
public int countCollisions(String directions) {
int n = directions.length();
if (n == 1) {
return 0;
}
boolean[] hasCar = new boolean[n];
boolean[] Lmoved = new boolean[n];
int res = 0;
// 优先处理 R
for (int i = 0; i < n; i++) {
if (directions.charAt(i) == 'S') {
hasCar[i] = true;
}
if (directions.charAt(i) != 'R') {
continue ;
}
int j = i;
while (j < n && directions.charAt(j) == 'R') {
j++;
}
if (j >= n) {
break;
}
if (directions.charAt(j) == 'L') {
Lmoved[j] = true;
res += (2 + (j - i - 1));
}
if (directions.charAt(j) == 'S') {
res += (j - i);
}
for (int k = i; k <= j; k++) hasCar[k] = true;
i = j - 1;
}
// 处理 'L'
for (int i = 0; i < n; i++) {
if (directions.charAt(i) != 'L' || (i == 0) || Lmoved[i]) {
continue ;
}
if (hasCar[i - 1]) {
hasCar[i] = true;
res++;
}
}
return res;
}
}