• LeetCode 2511. 最多可以摧毁的敌人城堡数目


    【LetMeFly】2511.最多可以摧毁的敌人城堡数目

    力扣题目链接:https://leetcode.cn/problems/maximum-enemy-forts-that-can-be-captured/

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

    方法一:遍历

    这道题说白了就是问你1-1之间最大的连续0的个数。

    因此我们只需要使用一个变量last来记录上一个非0数是1还是-1,再使用一个变量cnt来记录当前连续0的个数。

    接着遍历地图数组:

    • 如果当前元素非零:
      • 就看是否为 “1遇到-1-1遇到1”,如果是则更新答案最大值
      • 更新cntlast
    • 否则(当前元素为0): c n t + + cnt++ cnt++

    即可。

    • 时间复杂度 O ( l e n ( f o r t s ) ) O(len(forts)) O(len(forts))
    • 空间复杂度 O ( 1 ) O(1) O(1)

    AC代码

    C++
    class Solution {
    public:
        int captureForts(vector<int>& forts) {  // 1和-1之间最多连续0的个数
            int ans = 0;
            int last = 2, cnt = 0;
            for (int i = 0; i < forts.size(); i++) {
                if (forts[i]) {
                    if ( last != forts[i] && last != 2) {
                        ans = max(ans, cnt);
                    }
                    last = forts[i];
                    cnt = 0;
                }
                else {  // 0
                    cnt++;
                }
            }
            return ans;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    Python
    # from typing import List
    
    class Solution:
        def captureForts(self, forts: List[int]) -> int:
            ans = 0
            last, cnt = 2, 0
            for fort in forts:
                if fort:
                    if fort != last and last != 2:
                        ans = max(ans, cnt)
                    cnt = 0
                    last = fort
                else:
                    cnt += 1
            return ans
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    同步发文于CSDN,原创不易,转载经作者同意后请附上原文链接哦~
    Tisfy:https://letmefly.blog.csdn.net/article/details/132634912

  • 相关阅读:
    顺序表(上)
    华为机试 - 最大平分数组
    【C++&&数据结构】二叉树搜索树【完整版】
    四种自动化测试模型实例及优缺点
    ZZCMS201910审计入门和SQL注入
    【LeetCode】【剑指offer】【圆圈中最后剩下的数字】
    .NET混合开发解决方案8 WinForm程序中通过设置固定版本运行时的BrowserExecutableFolder属性集成WebView2控件
    【Java】泛型擦除机制
    浅谈C++|文件篇
    立足小餐饮,“新名酒”江小白能走多远?
  • 原文地址:https://blog.csdn.net/Tisfy/article/details/132634912