青岛做网站的,医疗网站建设目录,苏中建设 官方网站,做英文网站需要多长时间来源#xff1a;力扣#xff08;LeetCode#xff09;
描述#xff1a;
给你一个长度为 n #xff0c;下标从 0 开始的整数数组 forts #xff0c;表示一些城堡。forts[i] 可以是 -1 #xff0c;0 或者 1 #xff0c;其中#xff1a;
-1 表示第 i 个位置 没有 城堡。…来源力扣LeetCode
描述
给你一个长度为 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 处移动到 j 处时需要满足如下要求
由于在 i 处的城堡为你方军队控制的城堡则一定满足 forts[i] 1由于在 j 处为空位置则一定满足 forts[j] −1在移动过程中如下由于军队经过的位置只只能为敌人的城堡因此当 k ∈ (min(i, j), max(i, j)) 时需满足 forts[k] 0。当军队移动时所有途中经过的敌人城堡都会被摧毁题目要求找到一次移动后可以摧毁敌人城堡的最大数目。
根据以上分析可以知道由于军队只能在不同位置之间连续移动军队移动的起点为 1军队移动的终点为 −1军队可以向左移动也可以向右移动因此我们只需要找到相邻的 1 与 −1 之间的最大距离即可此时 1 与 −1 之间所有的 0 都会被摧毁。查找过程如下
依次遍历为数组 forts 中的每个元素此时我们用 pre 记录数组中前一个为 1 或者 −1 的位置假设当前元素 forts[i] 为 1 或者 −1即当前位置可能为军队的起点为终点此时假设 forts[i] ≠ forts[pre]即此时可以在 i 与 pre 之间可以移动此时可以摧毁的城堡数目为 i − pre − 1更新当前的最大城堡数目同时记录新的 pre
按照上述方法找到最大可以摧毁的城堡数目即可。
代码
class Solution {
public:int captureForts(vectorint forts) {int ans 0, pre -1;for (int i 0; i forts.size(); i) {if (forts[i] 1 || forts[i] -1) {if (pre 0 forts[i] ! forts[pre]) {ans max(ans, i - pre - 1);}pre i;}}return ans;}
};时间 4ms 击败 49.52%使用 C 的用户 内存 7.31MB 击败 79.65%使用 C 的用户 复杂度分析 时间复杂度O(n)其中 n 表示数组 forts 的长度。在遍历 forts 时每个元素只会遍历一次因此时间复杂度为 O(n)。空间复杂度O(1)。 author力扣官方题解