• 【力扣每日一题】2023.9.2 最多可以摧毁的敌人城堡数量


    目录

    题目:

    示例:

    分析:

    代码:


    题目:

    示例:

    分析:

    这道题难在阅读理解,题目看得我匪夷所思,错了好多个测试用例才明白题目说的是什么。

    我简单翻译一下就是寻找1和-1之间0最多的数量,1和-1之间只能有0。

    我们可以套两层循环,第一层for循环去寻找1,如果找到了1,那么我们开始在当前下标往左右两边寻找最近的-1,并且统计0的数量,需要注意的是如果先碰到了1,那么表示我们无法落脚,也就不能更新答案,因为题目说的我们只能在-1的地方落脚,并且1到-1之间只能有0。

    在结束往右寻找的时候,我们可以把往右寻找的下标赋值给第一层循环的下标,因为我们结束往右寻找的时候,下标所在的位置要么是1要么是-1,赋值给第一层循环可以少遍历几次,不过题目中给的数据量比较小,所以这个小优化是可有可无的。

     具体操作可以参考下面的代码和动图。

    代码:

    1. class Solution {
    2. public:
    3. int captureForts(vector<int>& forts) {
    4. int res=0;
    5. int n=forts.size();
    6. for(int i=0;i
    7. if(forts[i]==1){ //遇到了自己的城堡
    8. int t=0,index=i-1;
    9. while(index>=0){ //去寻找左边能摧毁的敌人城堡数量
    10. if(forts[index]==1) break; //先遇到自己的城堡则表示左边没有落脚点
    11. if(forts[index]==-1){ //当遇到空地就结束寻找并更新答案
    12. res=max(res,t);
    13. break;
    14. }
    15. t++;index--;
    16. }
    17. t=0,index=i+1;
    18. while(index//去寻找右边能摧毁的敌人城堡数量
    19. if(forts[index]==1) break;
    20. if(forts[index]==-1){
    21. res=max(res,t);
    22. break;
    23. }
    24. t++;index++;
    25. }
    26. //i=index-1; //小小优化一下,可有可无
    27. }
    28. }
    29. return res;
    30. }
    31. };

  • 相关阅读:
    技术实践|高斯集群服务器双缺省网关故障分析
    JavaScript运算符
    Ubuntu挂载windows下的共享文件夹
    C++笔记之初始化二维矩阵的方法
    线程和进程
    SpringBoot中@Scheduled定时任务重复执行、输出两次日志的问题
    SystemVerilog Randomization点点滴滴
    BuyVM 卢森堡 VPS 测评
    红包雨高并发压测记录(200台机器压测实录)
    ACM练习——第一天
  • 原文地址:https://blog.csdn.net/m0_63235356/article/details/132634798