当前位置: 首页 > 后端技术 > Java

LeetCode-045-JumpingGameII

时间:2023-04-02 00:19:07 Java

JumpingGameII题目描述:给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表您可以在该位置跳跃的最大长度。您的目标是使用最少的跳跃次数到达数组中的最后一个位置。假设你总能到达数组的最后一个位置。例子见LeetCode官网。来源:LeetCode链接:https://leetcode-cn.com/probl...版权归LeetCode所有。商业转载请联系官方授权,非商业转载请注明出处。解法一:穷举法首先,如果nums的长度为1,因为不用走,直接返回0;如果nums的长度为2,由于必须到达最后一个位置,且至少需要一步,直接返回1;当不是前两种情况,首先声明一个变量length作为数组的最大索引位,声明一个变量result记录最小跳转次数,初始化为最大的int值,声明一个HashMaptoJumpTimes记录跳转的位置和对应的跳转到该位置的最少步数,声明一个队列toJump记录当前位置,声明一个队列times同步记录到达当前位置需要的步数,首先jumped加0次,然后遍历队列到跳转如下流程处理:从队列中取出一点cur;如果cur对应的数组的值为0,则跳过处理下一个队列中的值;判断toJumpTimes中是否有该位置的索引,如果存在则转到当前位置如果步数大于其他行走方式到达当前位置所走的步数,则跳过处理下一个;如果cur对应的数组的值大于等于length-cur,则可以直接从当前位置跳转到最后一个位置,然后判断当前跳转次数是否小于result,则更新结果的价值;否则,如果当前跳转次数不少于result,则跳转处理下一个;如果当前跳转次数小于result,则将cur+1~cur+nums[cur]索引位添加到toJump中,添加前需要判断toJumpTimes的key中是否有当前索引位:如果不存在且当前跳转次数小于result,则将当前索引位和对应的跳转次数添加到toJumpandtimes和toJumpTimes中;如果存在且当前跳转次数如果跳转次数小于最小跳转次数,则将当前索引位和对应的跳转次数添加到toJump和times中,更新toJumpTimes中的最小跳转次数为当前索引位。最后返回的结果就是最小的跳转次数。说明:处理方式类似LeetCode-055-跳跃游戏。importjava.util.*;publicclassLeetCode_045{publicstaticintjump(int[]nums){if(nums.length==1){return0;}if(nums.length==2){返回1;}int结果=Integer.MAX_VALUE;intlength=nums.length-1;//定义你走过的位置,记录到当前位置的最少步数MaptoJumpTimes=newHashMap<>();toJumpTimes.put(0,0);//定义当前位置StacktoJump=newStack<>();Stack次=newStack<>();toJump.push(0);次.push(0);while(!toJump.isEmpty()){整数cur=toJump.pop();整数curTimes=toJumpTimes.get(cur);如果(nums[cur]==0){继续;}//判断权重,如果到当前位置的步数大于其他动作到当前位置的步数,则跳过下一步的处理if(toJumpTimes.containsKey(cur)&&curTimes>toJumpTimes.get(当前)){c继续;}if(nums[cur]>=length-cur){if(curTimes+1=result){继续;}for(inti=1;i<=nums[cur];i++){if(!toJumpTimes.containsKey(cur+i)){if(curTimes+1