p130 跳完数组的最少跳数(leetcode 45)

一:解题思路

方法一:Time:O(n),Space:O(n)

方法二:Time:O(n),Space:O(1)

二:完整代码示例 (C++版和Java版)

方法一C++:

class Solution {
public:
    int jump(vector<int>& nums) 
    {
        if (nums.size() == 0) return -1;
        int n = nums.size();
        int maxValue = 0;
        vector<int> d(n,0);
        for (int i = 0; i < n; i++)
        {
            if (maxValue >= n - 1) return d[n-1];
            if (i > maxValue) return -1;
            maxValue = max(maxValue,i+nums[i]);
            int last = min(maxValue,n-1);
            for (int j = last; j > i && d[j] == 0; j--)
                d[j] = d[i] + 1;
        }

        return -1;
    }
};

方法一Java:

class Solution {
        public int jump(int[] nums) 
        {
              if(nums==null || nums.length==0) return -1;
              int n=nums.length;
              int[] d=new int[n];
              int maxValue=0;
              for(int i=0;i<n;i++)
              {
                  if(maxValue>=n-1) return d[n-1];
                  if(i>maxValue) return -1;
                  maxValue=Math.max(maxValue,i+nums[i]);
                  int last=Math.min(maxValue,n-1);
                  for(int j=last;j>i && d[j]==0;j--)
                      d[j]=d[i]+1;
              }
              
              return -1;
        }
    }

方法二C++:

class Solution {
public:
    int jump(vector<int>& nums) 
    {
        if (nums.size() == 0) return -1;
        if (nums.size() == 1) return 0;
        int n = nums.size();
        int maxValue = 0;
        int jumps = 0, curEnd = 0;
        for (int i = 0; i < n; i++)
        {
            if (maxValue >= n - 1) return jumps+1;
            if (i > maxValue) return -1;
            if (i > curEnd)
            {
                jumps++;
                curEnd = maxValue;
            }

            maxValue = max(maxValue,i+nums[i]);
        }

        return -1;
    }
};

方法二Java:

class Solution {
        public int jump(int[] nums)
        {
              if(nums==null || nums.length==0) return -1;
              if(nums.length==1) return 0;
              int jumps=0,curEnd=0;
              int n=nums.length;
              int maxValue=0;
              for(int i=0;i<n;i++)
              {
                  if(maxValue>=n-1) return jumps+1;
                  if(i>maxValue) return -1;
                  if(i>curEnd)
                  {
                      jumps++;
                      curEnd=maxValue;
                  }
                  maxValue=Math.max(maxValue,i+nums[i]);
              }

              return -1;
        }
    }

猜你喜欢

转载自www.cnblogs.com/repinkply/p/12706328.html
45