leetcode hard模式专杀之45. Jump Game II

来源:互联网 发布:淘宝买三唑仑输入什么 编辑:程序博客网 时间:2024/04/29 06:59

这道题跟其父题Jump Game都属于实现出来不难,但是通过OJ不容易的题目,反正我是这样感觉的,因为第一版我很快都写出来了,但是通过OJ却弄了七八次,蛋疼无比,不过总算是没有看答案,坚持自己写出来了,能仔细琢磨总结其经验,也不枉花了这么多时间。原本以为用其父题目稍微改改代码就能完成,后来发现不是这样,时间复杂度完全通不过,于是苦苦琢磨其他方式。最后思路大概是这样的,从第一个开始通过i+nums[i]获得该位置能跳跃到的index范围,然后删除i这个位置的节点(本质上是删除这个起步位置的集合,只不过第一次这个集合只有一个元素,可想而知第二部很可能有多个起跳位置,那就要删除多个),由于数组是不能做这样的操作的,故而转成java中的List来操作。为什么要删除,其实也是为了下一次计算的表达式能够更好看,能少跑几个节点。当然在第k次这样的操作的时候,可能有多个元素需要被从list删除,那么一直到list被删光,删除的次数就是jump的次数,不知道描述清楚了没有,直接上代码:




public class Solution {    public int jump(int[] nums) {        List<Integer> numsList = new ArrayList<>();        if(nums.length==1){            return 0;        }        for(int num: nums){            numsList.add(num);        }        int secSize = 1;        int upper = 0;        int count = 0;        while(true){            for(int i=0; i<secSize; i++){                int newIndex = i+numsList.get(i);                if(newIndex > upper){                    upper = newIndex;                    if(upper>=numsList.size()-1){                        return count+1;                    }                }            }            for(int i=0;i<secSize;i++){                numsList.remove(0);            }            count++;            int oldSecSize = secSize;            secSize = upper-secSize+1;            upper = upper-oldSecSize;        }    }}


原创粉丝点击