开启我的LeetCode刷题日记:1345. 跳跃游戏 IV

122 阅读3分钟

「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战

编程世界总是离不了算法

最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力

于是决定蹭着假期,加强算法和数据结构相关的知识

那怎么提升呢?

其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode刷题之旅

第一阶段目标是:200道,每天12

为了不乱,本系列文章目录分为三部分:

  1. 今日题目:xxx
  2. 我的思路
  3. 代码实现

今天题目:1345. 跳跃游戏 IV

难度:困难

给你一个整数数组 arr ,你一开始在数组的第一个元素处(下标为 0)。

每一步,你可以从下标 i 跳到下标:

i + 1 满足:i + 1 < arr.length i - 1 满足:i - 1 >= 0 j 满足:arr[i] == arr[j] 且 i != j 请你返回到达数组最后一个元素的下标处所需的 最少操作次数 。

注意:任何时候你都不能跳到数组外面。

 

我的思路

  1. 先处理非数组和单个元素数组
  2. 清晰最终的目标是到达最后一个元素所用步数
  3. i的变化得分三种情况,i + 1、i - 1和j ,任何情况都可能是最快的
  4. 首先扫一下整个数组,看最远的处有没有相等的,即j,如果有就移动,否则让i++
  5. 需要同时满足两个数相等,且不是同一个数
  6. 往回走先不考虑

代码实现

/**
* @param {number[]} arr
* @return {number}
*/
var minJumps = function (arr) {
    // 先处理非数组和单个元素数组
    if (Array.isArray(arr)) {
        var len = arr.length//数组长度
        if (len == 1) { return 0 }
        // 清晰最终的目标是到达最后一个元素所用步数
        // 首先下一步到达的元素小标,我们可以分三条支路,i + 1、i - 1和j 
        // 但是每条支路又会有支路,但是如果之前走过的,就说明这条支路走不通

        var count = 0;//步数
        for (var i = 0; i !== len - 1;) {//i !== len - 1表示走到最后一位了
            //i的变化得分三种情况,i + 1、i - 1和j ,任何情况都可能是最快的
            count++//表示每次记一步
            // 思路转变:
            // 其实可能是我想太复杂,我就按照我自己的思想来走
            // 首先扫一下整个数组,看最远的处有没有相等的,即j,如果有就移动,否则让i++
            for (var j = len - 1; j > i; j--) {//从最后开始比
                //需要同时满足两个数相等,且不是同一个数  
                if (arr[i] == arr[j] && i == j) {
                    i = j
                    break
                } else {
                    i++
                    break
                }
                //往回走我觉得还用来干扰我的,所以先不考虑
            }
        }
        return count
    };
};

总结

实现方式其实有很多,这里仅供参考~

由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹