leetcode55 jumpGame貪心演算法

2022-06-12 15:57:10 字數 2110 閱讀 5868

上題目:

解空間明確,乙個從 nums[0] 開始輻射出去的樹狀解空間。首先暴力搜尋一下,暴力搜尋解法:

public

final

boolean canjump(int

nums)

int length=nums.length;

return jump(nums,length,0);

}public

final

boolean jump(int nums,int length,int

current)

if(current>length-1)

boolean re=false

;

int currentsteps=nums[current];

for(int i=1;i<=currentsteps;i++)

return

re; }

解的過程中我們發現,回歸過程是自底向上的,在回歸的過程中,有大量的節點出現了重複計算,可考慮快取避免重複計算。快取搜尋:

public

final

boolean canjump(int

nums)

int length=nums.length;

int cache=new

int[length];

return jump(nums,length,0,cache);

}public

final

boolean jump(int nums,int length,int current,int

cache)

if(current>length-1||cache[current]==-1)

boolean re=false

;

int currentsteps=nums[current];

for(int i=1;i<=currentsteps;i++)

}cache[current]=re?1:-1;

return

re; }

快取計算定義好後,考慮避免遞迴帶來的棧幀釋放建立的開銷,逆推快取優化為動態規劃解法:

public

final

boolean dpjump1(int

nums)

int length =nums.length;

int cache = new

int[length];

int goodnode = 0;

for (int i = length - 1; i >= 0; i--)

for (int j = i + currentstep; j >= i; j--)

}printnums(cache);

}return cache[0] == 1 ? true : false

; }

動態規劃的過程中牽扯到兩層 for 迴圈,內層的 for 迴圈可以使用貪心演算法優化,以區域性最優解獲得全域性最優解,我們只需要找到互動範圍內最近的可到達終點的 goodnode 就可以了。貪心演算法:

//

貪心public

final

boolean dpjump(int

nums)

int length =nums.length;

int cache = new

int[length];

int goodnode = 0;

for (int i = length - 1; i >= 0; i--)

if (goodnode != 0 && (i + currentstep) >=goodnode)

printnums(cache);

}return cache[0] == 1 ? true : false

; }

LeetCode 跳躍遊戲 55

給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後乙個位置。示例 1 輸入 2,3,1,1,4 輸出 true 解釋 從位置 0 到 1 跳 1 步,然後跳 3 步到達最後乙個位置。示例 2 輸入 3,2,1,0,4 輸出 fa...

LeetCode55 跳躍遊戲

leetcode55.跳躍遊戲 給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後乙個位置。示例 1 輸入 2,3,1,1,4 輸出 true 解釋 從位置 0 到 1 跳 1 步,然後跳 3 步到達最後乙個位置。示例 2 輸入...

LeetCode 55 跳躍遊戲

題目鏈結 題目描述 給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後乙個位置。示例輸入 2,3,1,1,4 輸出 true 解釋 從位置 0 到 1 跳 1 步,然後跳 3 步到達最後乙個位置。輸入 3,2,1,0,4 輸出 ...