• [Leetcode 100] 130 Jump Game II


    Problem:

    Given an array of non-negative integers, you are initially positioned at the first index of the array.

    Each element in the array represents your maximum jump length at that position.

    Your goal is to reach the last index in the minimum number of jumps.

    For example:
    Given array A = [2,3,1,1,4]

    The minimum number of jumps to reach the last index is 2. (Jump 1 step from index 0 to 1, then 3 steps to the last index.)

    Analysis:

    At first thought, this problem can be solved by DP. Starting from the first position, for every reachable position from first position, copmare the current step with the step from first position to get to it and take the min one. Then continue this process at 2, 3, 4, ..... n position, at last the step[n-1] keeps the minimum steps needed to get from start to the end. But this method can't pass the large test case. One possible input is [1000, 999, 998, ....., 1], the conplexity is O(N^2). It's untorable.

    So we have to think more simple ways to solve it. Every time we keep the maximum position we can go until now. And we still use an array to keep steps needed to get each position. But unlike the above method, if A[i]+i is less than maximum, we simply skip it. And if A[i]+i > maximum, we only set those [maximum+1, A[i]+i] positions step to step[i]+1. And if anytime we reach the end of the array, we exit the computing. This method is totally linear. After searching online, I know this method is called greedy method.

    Code:

    DP solution (TLE for large test)

     1 class Solution {
     2 public:
     3     int jump(int A[], int n) {
     4         // Start typing your C/C++ solution below
     5         // DO NOT write int main() function
     6         int *step = new int[n];
     7         int MAX = (1<<31)-1;
     8         
     9         for (int i=1; i<n; i++)
    10             step[i] = MAX;
    11         step[0] = 0;    
    12         
    13         for (int i=0; i<n; i++) {
    14             for (int j=1; j<=A[i] && (i+j)<n; j++) {
    15                 step[i+j] = min(step[i]+1, step[i+j]);
    16             }
    17         }
    18         
    19         return step[n-1];
    20     }
    21     
    22 private:
    23     int min(int a, int b) {
    24         return (a < b) ? a : b;
    25     }
    26 };
    View Code

    Greedy Solution (48ms for large test)

     1 class Solution {
     2 public:
     3     int jump(int A[], int n) {
     4         // Start typing your C/C++ solution below
     5         // DO NOT write int main() function
     6         int max = 0;
     7         int *step = new int[n];
     8         
     9         step[0] = 0;
    10         for (int i=0; i<n; i++) {
    11             if (max >= (n-1)) break;
    12 
    13             if (max < (A[i] + i)) {
    14                 for (int j=max+1; j<=A[i]+i && j < n; j++)
    15                     step[j] = step[i]+1;
    16 
    17                 max = A[i] + i;
    18             }
    19         }
    20         
    21         return step[n-1];
    22     }
    23 };
    View Code
  • 相关阅读:
    ubuntu 安装ftp,配置,和java调用
    ubuntu 安装ftp nginx tomcat,mysql
    idea安装插件
    使用spring boot,gradle,idea,js,html创建一个小的前后端程序
    使用浏览器,调试js代码
    spring boot 使用静态资源
    word使用
    latex 转word
    qsv转mp4
    qsv转换为mp4,下载腾讯视频为MP4格式
  • 原文地址:https://www.cnblogs.com/freeneng/p/3242289.html
Copyright © 2020-2023  润新知