LeetCode 题解工作台

最多可以摧毁的敌人城堡数目

给你一个长度为 n ,下标从 0 开始的整数数组 forts ,表示一些城堡。 forts[i] 可以是 -1 , 0 或者 1 ,其中: -1 表示第 i 个位置 没有 城堡。 0 表示第 i 个位置有一个 敌人 的城堡。 1 表示第 i 个位置有一个你控制的城堡。 现在,你需要决定,将你的军队从…

category

2

题型

code_blocks

6

代码语言

hub

3

相关题

当前训练重点

简单 · 双·指针·invariant

bolt

答案摘要

我们用指针 遍历数组 ,指针 从 的下一个位置开始遍历,直到遇到第一个非 的位置,即 $forts[j] \neq 0$。如果 $forts[i] + forts[j] = 0$,那么我们可以将军队在 和 之间移动,摧毁 $j - i - 1$ 个敌人城堡。我们用变量 记录最多可以摧毁的敌人城堡数目即可。 时间复杂度 ,空间复杂度 。其中 为数组 `forts` 的长度。

Interview AiBox logo

Interview AiBox 实时 AI 助手,陪你讲清 双·指针·invariant 题型思路

试试 AiBox 面试助手arrow_forward
description

题目描述

给你一个长度为 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
lightbulb

解题思路

方法一:双指针

我们用指针 ii 遍历数组 fortsforts,指针 jjii 的下一个位置开始遍历,直到遇到第一个非 00 的位置,即 forts[j]0forts[j] \neq 0。如果 forts[i]+forts[j]=0forts[i] + forts[j] = 0,那么我们可以将军队在 iijj 之间移动,摧毁 ji1j - i - 1 个敌人城堡。我们用变量 ansans 记录最多可以摧毁的敌人城堡数目即可。

时间复杂度 O(n)O(n),空间复杂度 O(1)O(1)。其中 nn 为数组 forts 的长度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution:
    def captureForts(self, forts: List[int]) -> int:
        n = len(forts)
        i = ans = 0
        while i < n:
            j = i + 1
            if forts[i]:
                while j < n and forts[j] == 0:
                    j += 1
                if j < n and forts[i] + forts[j] == 0:
                    ans = max(ans, j - i - 1)
            i = j
        return ans
speed

复杂度分析

指标
时间Depends on the final approach
空间Depends on the final approach
psychology

面试官常问的追问

外企场景
  • question_mark

    Check if you can identify sequences of enemy forts between your forts and empty positions.

  • question_mark

    Use two-pointer scanning to efficiently traverse the array and count captures.

  • question_mark

    Keep track of valid moves without double-counting or skipping enemy forts.

warning

常见陷阱

外企场景
  • error

    Forgetting to count only enemy forts between a valid start and end position.

  • error

    Resetting counters incorrectly, leading to missed maximum captures.

  • error

    Assuming diagonal or non-consecutive moves are allowed, which violates the problem constraints.

swap_horiz

进阶变体

外企场景
  • arrow_right_alt

    Find the maximum number of enemy forts captured if multiple armies can move simultaneously.

  • arrow_right_alt

    Calculate captures when forts can only move to adjacent empty positions.

  • arrow_right_alt

    Determine maximum captures when some enemy forts are immune and cannot be captured.

help

常见问题

外企场景

最多可以摧毁的敌人城堡数目题解:双·指针·invariant | LeetCode #2511 简单