2511. 最多可以摧毁的敌人城堡数目
题目描述
给你一个长度为 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:
输入:forts = [1,0,0,-1,0,0,0,0,1] 输出:4 解释: - 将军队从位置 0 移动到位置 3 ,摧毁 2 个敌人城堡,位置分别在 1 和 2 。 - 将军队从位置 8 移动到位置 3 ,摧毁 4 个敌人城堡。 4 是最多可以摧毁的敌人城堡数目,所以我们返回 4 。
示例 2:
输入:forts = [0,0,1,-1] 输出:0 解释:由于无法摧毁敌人的城堡,所以返回 0 。
提示:
1 <= forts.length <= 1000-1 <= forts[i] <= 1
解法
方法一:双指针
我们用指针 \(i\) 遍历数组 \(forts\),指针 \(j\) 从 \(i\) 的下一个位置开始遍历,直到遇到第一个非 \(0\) 的位置,即 \(forts[j] \neq 0\)。如果 \(forts[i] + forts[j] = 0\),那么我们可以将军队在 \(i\) 和 \(j\) 之间移动,摧毁 \(j - i - 1\) 个敌人城堡。我们用变量 \(ans\) 记录最多可以摧毁的敌人城堡数目即可。
时间复杂度 \(O(n)\),空间复杂度 \(O(1)\)。其中 \(n\) 为数组 forts 的长度。
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |