【每日一题Day313】LC2511最多可以摧毁的敌人城堡数目 | 模拟

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

给你一个长度为 n ,下标从 0 开始的整数数组 forts ,表示一些城堡。forts[i] 可以是 -10 或者 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)

你可能感兴趣的:(每日一题,模拟,leetcode)