给你一个长度为 n ,下标从 0 开始的整数数组 forts ,表示一些城堡。forts[i] 可以是 -1 ,0 或者 1 ,其中:
-1 表示第 i 个位置 没有 城堡。
0 表示第 i 个位置有一个 敌人 的城堡。
1 表示第 i 个位置有一个你控制的城堡。
现在,你需要决定,将你的军队从某个你控制的城堡位置 i 移动到一个空的位置 j ,满足:
0 <= i, j <= n - 1
军队经过的位置 只有 敌人的城堡。正式的,对于所有 min(i,j) < k < max(i,j) 的 k ,都满足 forts[k] == 0 。
当军队移动时,所有途中经过的敌人城堡都会被 摧毁 。
请你返回 最多 可以摧毁的敌人城堡数目。如果 无法 移动你的军队,或者没有你控制的城堡,请返回 0 。
输入:forts = [1,0,0,-1,0,0,0,0,1]
输出:4
解释:
- 将军队从位置 0 移动到位置 3 ,摧毁 2 个敌人城堡,位置分别在 1 和 2 。
- 将军队从位置 8 移动到位置 3 ,摧毁 4 个敌人城堡。
4 是最多可以摧毁的敌人城堡数目,所以我们返回 4 。
输入:forts = [0,0,1,-1]
输出:0
解释:由于无法摧毁敌人的城堡,所以返回 0 。
提示:
1 <= forts.length <= 1000
-1 <= forts[i] <= 1
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
| //@lc code = start
impl Solution {
/// ## 解题思路
/// - 遍历
/// 1. 设置2个变量l_me, l_empty分别记录最近的我方及空城的下标;
/// 2. 从左至右按序遍历forts;
/// 3. 如果forts[i]为我方,且最近的空城比我方要近(l_empty >
/// l_me),则计算与该空城间的距离;
/// 4. 如果forts[i]为空城,且最近的我方比空城要近(l_empty <
/// l_me),则计算两者之间距离;
/// 5. 最大距离-1为催毁最多的敌方堡垒数量;
pub fn capture_forts(forts: Vec<i32>) -> i32 {
let (mut l_me, mut l_empty) = (0, 0);
let mut res = 0;
for i in 0..forts.len() {
let ii = i+1;
match forts[i] {
1 => {
if l_empty > l_me {
res = res.max((ii- l_empty - 1) as i32);
}
l_me = ii;
}
-1 => {
if l_me > l_empty {
res = res.max((ii-l_me -1) as i32);
}
l_empty = ii;
}
_ => {}
}
}
res
}
}
//@lc code = end
|