摘要:還有一個(gè)石頭可能由之前的多個(gè)石頭到達(dá),這又是可以?xún)?yōu)化的地方。當(dāng)前結(jié)果可由之前的結(jié)果得出,且有重復(fù)的搜索方法,就需要用。
[鏈接描述]leetcode 題目。
有點(diǎn)類(lèi)似于jump game, 只不過(guò)這里對(duì)步數(shù)有了隱形的要求,當(dāng)前步數(shù)和之前步數(shù)有關(guān)。
如果我們用brute force的方法來(lái)解,每一步有三種可能,一共n個(gè)石頭,時(shí)間復(fù)雜度就是O(3^n)。
這其中有很多步數(shù)是多余的,第i個(gè)石頭無(wú)法從任何一個(gè)石頭到達(dá),那么我們應(yīng)該立即中止搜尋。
還有一個(gè)石頭可能由之前的多個(gè)石頭到達(dá),這又是可以?xún)?yōu)化的地方。
當(dāng)前結(jié)果可由之前的結(jié)果得出,且有重復(fù)的搜索方法,就需要用DP。
public class Solution { public boolean canCross(int[] stones) { if(stones[1] != 1) return false; int n = stones.length; int[][] dp = new int[n][n]; // for ith stones, j means maximun previous steps for(int i=0; istones[i] + j + 1){ // too far dp[i][j] = 0; continue; } else { // j-1, j, j+1 three possibility if(canCross(dp, stones, k, stones[k] - stones[i], n)){ dp[i][j] = 1; return true; } } } dp[i][j] = 0; return false; } }
public class Solution { public boolean canCross(int[] stones) { if(stones == null || stones.length == 0) return false; int n = stones.length; if(n == 1) return true; if(stones[1] != 1) return false; if(n == 2) return true; HashSetset = new HashSet<>(); for(int i = 0; i < n; i++){ if(i > 3 && stones[i] > stones[i-1]*2) return false; set.add(stones[i]); } return canCross(set, stones[n-1], 1, 1); } public boolean canCross(HashSet set, int last, int pos, int jump){ if(pos + jump == last || pos + jump + 1 == last || pos + jump -1 == last){ return true; } if(set.contains(pos + jump + 1)){ if(canCross(set, last, pos+jump+1, jump+1)) return true; } if(set.contains(pos + jump)){ if(canCross(set, last, pos+jump, jump)) return true; } if(jump > 1 && set.contains(pos + jump-1)){ if(canCross(set, last, pos+jump-1, jump-1)) return true; } return false; } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/66292.html
Problem A frog is crossing a river. The river is divided into x units and at each unit there may or may not exist a stone. The frog can jump on a stone, but it must not jump into the water. Given a li...
摘要:石頭的位置用整數(shù)數(shù)組來(lái)表示。廣度優(yōu)先遍歷可以從起點(diǎn)開(kāi)始,對(duì)從該點(diǎn)出發(fā)的所有可能步數(shù)進(jìn)行遍歷,并更新從該點(diǎn)可達(dá)的點(diǎn)的所有的可行步數(shù)。利用數(shù)據(jù)結(jié)構(gòu)來(lái)記錄該結(jié)果,其中的為的數(shù),它的對(duì)應(yīng)的是從該出發(fā)的所有的上一步的步長(zhǎng)。 題目要求 A frog is crossing a river. The river is divided into x units and at each unit the...
摘要:轉(zhuǎn)換為廣度優(yōu)先算法即為我們只需要找到每一步的開(kāi)始節(jié)點(diǎn)和結(jié)束下標(biāo),找到下一輪遍歷的最大下標(biāo),如果該下標(biāo)超過(guò)了數(shù)組長(zhǎng)度,那么結(jié)束遍歷,返回步數(shù),否則將上一輪的最終節(jié)點(diǎn)加一作為起始節(jié)點(diǎn),并將下一輪最大下標(biāo)最為結(jié)束節(jié)點(diǎn),繼續(xù)遍歷。 題目要求 Given an array of non-negative integers, you are initially positioned at the ...
摘要:復(fù)雜度思路每次設(shè)置一個(gè)窗口,觀(guān)察在這一步下能到達(dá)的最遠(yuǎn)距離,不斷的移動(dòng)這個(gè)窗口。計(jì)數(shù),需要移動(dòng)幾次,才能覆蓋到末尾的值。 LeetCode[45] Jump Game II Given an array of non-negative integers, you are initially positioned at the first index of the array. Eac...
摘要:建立動(dòng)規(guī)數(shù)組,表示從起點(diǎn)處到達(dá)該點(diǎn)的可能性。循環(huán)結(jié)束后,數(shù)組對(duì)所有點(diǎn)作為終點(diǎn)的可能性都進(jìn)行了賦值。和的不同在于找到最少的步數(shù)。此時(shí)的一定是滿(mǎn)足條件的最小的,所以一定是最優(yōu)解。 Jump Game Problem Given an array of non-negative integers, you are initially positioned at the first index...
閱讀 2893·2021-09-28 09:36
閱讀 3647·2021-09-27 13:59
閱讀 2497·2021-08-31 09:44
閱讀 2285·2019-08-30 15:54
閱讀 2359·2019-08-30 15:44
閱讀 1192·2019-08-30 13:45
閱讀 1231·2019-08-29 18:38
閱讀 1219·2019-08-29 18:37