「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战」
编程世界总是离不了算法
最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力
于是决定蹭着假期,加强算法和数据结构相关的知识
那怎么提升呢?
其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode刷题之旅
第一阶段目标是:200道,每天1到2篇
为了不乱,本系列文章目录分为三部分:
- 今日题目:xxx
- 我的思路
- 代码实现
今天题目:1345. 跳跃游戏 IV
难度:困难
给你一个整数数组 arr ,你一开始在数组的第一个元素处(下标为 0)。
每一步,你可以从下标 i 跳到下标:
i + 1 满足:i + 1 < arr.length i - 1 满足:i - 1 >= 0 j 满足:arr[i] == arr[j] 且 i != j 请你返回到达数组最后一个元素的下标处所需的 最少操作次数 。
注意:任何时候你都不能跳到数组外面。
我的思路
- 先处理非数组和单个元素数组
- 清晰最终的目标是到达最后一个元素所用步数
- i的变化得分三种情况,i + 1、i - 1和j ,任何情况都可能是最快的
- 首先扫一下整个数组,看最远的处有没有相等的,即j,如果有就移动,否则让i++
- 需要同时满足两个数相等,且不是同一个数
- 往回走先不考虑
代码实现
/**
* @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
};
};
总结
实现方式其实有很多,这里仅供参考~
由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹