最多可以摧毁的敌人城堡数目【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; } }- 复杂度
- 时间复杂度: O ( n ) \mathcal{O}(n) O(n)
- 空间复杂度: O ( 1 ) \mathcal{O}(1) O(1)
- 复杂度

文章讨论如何通过编程解决从控制城堡到空位的路径中摧毁敌方城堡数量的问题,涉及数组操作和策略优化。

被折叠的 条评论
为什么被折叠?



