LeetCode 45跳跃游戏&46全排列

admin 2025-07-25 7人围观 ,发现29个评论

很多人觉得学习Java很难,其实是因为少了这些资源,私我发送[bigsai]即可领取资源哦!

跳跃游戏

题目描述:

示例:

分析:

这题的话也是运用了不同的方法,从复杂到简单。

法一:枚举

枚举的思路很简单,二重循环,第一次循环遍历每个数,第二次循环遍历长度更新这个范围内能够更新到的最小跳数。如果能跳到该位置并且跳跃次数更少就更新。算法想法简单,初始需要将除第0位其他设置为非常大的值(以便有更小的值进行更新)

实现代码为:

publicintjump(int[]nums){intdp[]=newint[];for(inti=1;;i++){dp[i]=_VALUE;}for(inti=0;;i++){inttime=dp[i]+1;for(intj=0;jnums[i];j++){if(j+i+1){if(dp[j+i+1]time)dp[j+i+1]=time;}}}//((dp));returndp[];}

不过效果很糟糕。

法二:bfs
在这条路行不通之后,就开始寻找另一条路。我便想着用优先队列搜索,具体比较麻烦详细可以看代码,主要讲第三种方法:

classnode{inttime;intindex;publicnode(inttime,intindex){=time;=index;}}publicintjump(int[]nums){booleanjud[]=newboolean[];Queuenodeq1=newPriorityQueuenode(newComparatornode(){@Overridepublicintcompare(nodeo1,nodeo2){if(==){;};}});(newnode(0,0));while(!()){nodeteam=();inttime=+1;intindex=;for(inti=1;i=nums[index];i++)//前进的位置{if(index+!jud[index+i]){if(index+i==)returntime;(newnode(time,index+i));jud[index+i]=true;}}}return0;}


法三:贪心
当我以为9ms很快的时候,发现原来这个速度还是很慢,就想肯定有一种近O(n)的方法,在这里索性分享给大家。

我们在这里需要的实什么?

找到最少的跳跃次数到达最后

影响我们正常计算的最大障碍是什么?

重复计算、覆盖情况.无论是跳跃方式和跳跃次数到达终点都可能不止一种。


但是有一点非常重要的是:每个节点跳跃的时候是一个从他开始的覆盖区间范围,所以我们能否知道第一次跳多远。第二次跳多远呢?第三次呢?

很简单,所有的起始点是0号位置,也就是第一次一定是从0号跳到的一个区间节点。而第二次就是这个区间内能够跳到的最远距离都是2次,第三次就是除掉第二次节点后面能够跳到的区间……这样一直到能够覆盖到最后即可完成。

在具体实现的时候,记录当前的最大长度,用一个time[]数组表示到达当前节点需要的跳数,从前往后,如果最大长度大于当前的maxsize,就说明需要加一次更新,如果小于等于maxsize,对应位置则不需要更新。

实现代码为:

publicintjump(int[]nums){intlen=;inttime[]=newint[len];intmaxsize=0;for(inti=0;ilen;i++){if(i+nums[i]maxsize){for(intj=maxsize+1;j=i+nums[i];j++){if(jlen){time[j]=time[i]+1;maxsize=j;}else{break;}}}}returntime[len-1];}


还能优化成1ms的就留给你们来了!

全排列

全排列的两种实现方式这里就不赘述,大家可以参考:全排列两种实现方式

实现方式为:

publicListListIntegerpermute(int[]nums){ListListIntegerlist=newArrayListListInteger();arrange(nums,0,,list);returnlist;}privatevoidarrange(int[]nums,intstart,int,ListListIntegerlist){if(start==){ListIntegerlist2=newArrayListInteger();for(inta:nums){(a);}(list2);}for(inti=start;i=;i++){swap(nums,i,start);arrange(nums,start+1,,list);swap(nums,i,start);}}privatevoidswap(int[]nums,inti,intj){intteam=nums[i];nums[i]=nums[j];nums[j]=team;}

本次就到这里啦,感觉不错记得点赞或一键三连哦!

猜你喜欢
不容错过