最多可以摧毁的敌人城堡数目【LC2511】
给你一个长度为
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
。
思路:阅读理解题
- 题意可以转化为,找到数组中相邻的1和-1之间最多的0的个数
- 实现时,可以使用变量记录军队和空位置的下标,当同时找到两个位置时,对结果进行更新;
- 当找到新的军队位置或者空位置时,需要判断前一个空位置或者军队位置是否有效
- 实现
class Solution { public int captureForts(int[] forts) { int army = -1, empty = -1;// 记录军队和空位置的下标 int n = forts.length; int res = 0; for (int i = 0; i < n; i++){ if (forts[i] == -1){// 找到了一个新的空位置 if (army < empty){// 如果军队位置army在旧空位置之前,那么需要寻找新的军队位置 army = -1; } empty = i; }else if (forts[i] == 1){// 找到了一个新的军队位置 if (empty < army){// 如果空位置empty在旧军队位置之前,那么需要寻找新的空位置 empty = -1; } army = i; } if (army != -1 && empty != -1){// 找到两个位置时,计算其中的敌人城堡数目 res = Math.max(res, Math.abs(army - empty) - 1); } } return res; } }