【每日一题Day94】LC1824最少侧跳次数 | 贪心

最少侧跳次数【LC1824】

给你一个长度为 n3 跑道道路 ,它总共包含 n + 1 ,编号为 0n 。一只青蛙从 0 号点第二条跑道 出发 ,它想要跳到点 n 处。然而道路上可能有一些障碍。

给你一个长度为 n + 1 的数组 obstacles ,其中 obstacles[i]取值范围从 0 到 3)表示在点 i 处的 obstacles[i] 跑道上有一个障碍。如果 obstacles[i] == 0 ,那么点 i 处没有障碍。任何一个点的三条跑道中 最多有一个 障碍。

  • 比方说,如果 obstacles[2] == 1 ,那么说明在点 2 处跑道 1 有障碍。

这只青蛙从点 i 跳到点 i + 1 且跑道不变的前提是点 i + 1 的同一跑道上没有障碍。为了躲避障碍,这只青蛙也可以在 同一个 点处 侧跳另外一条 跑道(这两条跑道可以不相邻),但前提是跳过去的跑道该点处没有障碍。

  • 比方说,这只青蛙可以从点 3 处的跑道 3 跳到点 3 处的跑道 1 。

这只青蛙从点 0 处跑道 2 出发,并想到达点 n 处的 任一跑道 ,请你返回 最少侧跳次数

注意:点 0 处和点 n 处的任一跑道都不会有障碍。

除夕快乐~
无心做题

贪心
  • 思路:模拟整个过程会有三种情况(很像跑酷)

    • 如果前方 ( i + 1 ) (i+1) (i+1)没有障碍,那么继续直行;
    • 如果前方有障碍,并且该点处 ( i ) (i) (i)没有障碍,贪心找到下一个最远的没有障碍的跑道
      • 局部最优:每次侧跳的距离最远
      • 全局最远:总侧跳次数最少
    • 如果前方有障碍,并且该点处 ( i ) (i) (i)有障碍,那么侧跳到另一没有障碍的点处
  • 实现:

    由于本题只有单条道路,道路的编号是1、2和3,因此贪心转移跑道时,可以使用6-当前跑道-最近有障碍的不是当前的跑道编号就可以得到转移的跑道编号

    class Solution {
        public int minSideJumps(int[] obstacles) {
            int res = 0, n = obstacles.length;
            int now = 2;
            for (int i = 0; i < n - 1; i++){
                if (obstacles[i + 1] == now){// 前方有障碍
                    res++;
                    if (obstacles[i] != 0){ // 该点有障碍           
                        now = 6 - now - obstacles[i];
                    }else{// 该点无障碍
                        while (i + 1 < n && (obstacles[i + 1] == 0 || obstacles[i + 1] == now)){
                            i++;
                        }
                        if(i + 1 >= n) return res;
                        now = 6 - now - obstacles[i + 1];
                    }
                }
            }
            return res;
        }
    }
    
    • 复杂度
      • 时间复杂度: O ( n ) O(n) O(n)
      • 空间复杂度: O ( 1 ) O(1) O(1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值