很多人觉得学习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;}本次就到这里啦,感觉不错记得点赞或一键三连哦!