貪心VS動態規劃 Jump Game 2
阿新 • • 發佈:2019-01-07
問題:Given an array of non-negative integers, you are initially positioned at the first index of the array.
. (Jump
貪心演算法:
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
1
step
from index 0 to 1, then 3
steps to the last index.)
思路:
一、首先想到動態規劃。陣列H[ ], H[i]表示index從0到i的最少跳數。若H[i] = m,那麼試圖去更新i之後的m個位置的最少跳數。
可是,需要空間複雜度O(N)。
二、貪心演算法。貪心就要每次都試圖走的更遠,意思並不是走到這一次所能走範圍的最遠,而是在這一次所能走範圍裡尋找下一次能走最遠的位置。
這樣的策略就是竭力要走的更遠。
動態規劃法:
int jump(int A[], int n) { if(n < 2) return 0; int H[n]; memset(H, 0, sizeof(H)); H[0] = 0; for(int i=0;i<n-1;i++) { int m = A[i]; if(i + m >= n-1) return H[i] + 1; for(int j=1;j<=m;j++) { if(H[i+j] == 0 || H[i+j] > H[i] + 1) H[i+j] = H[i] + 1; } } return H[n-1]; }
貪心演算法:
// 貪心演算法 int jump(int A[], int n) { if(n < 2) return 0; int cur = 0; int count = 1; while(true) { if(cur + A[cur] >= n-1) return count; //在cur所能到達的範圍裡找一個能跳最遠的 int max = cur + 1; for(int i=cur+2;i<=cur+A[cur]; i++) if(i + A[i] > max + A[max]) max = i; cur = max; count++; } }