碰到一道經典的,Max Min Path

題目大概是這個意思:給定一個n*m的數組,找到每一條能從左上角探索到左下角的path,然後每一條path裏找到最小值,所有這些最小值合在一起,看最大值是哪個。

舉個例子:

[8, 4, 7]

[6, 5, 9]

有3條path:

8-4-7-9 min: 4

8-4-5-9 min: 4

8-6-5-9 min: 5

return: 5


這道題看地理大家激烈的討論,說拿DP可以做?但是我覺得不行啊,DP的話只能new一個對應的數組,然後一邊探索一邊更新這個數組,而且註定要recursive。但是問題是,你怎麼能一邊一直取最小值,到最後一個點又取最大值呢?倒是維護一下也可以,但是地理幾位仁兄提的直接dp的實在不敢苟同,他們的方法更像是每個dp的grid都記錄之前點最小值中的最大值,那到最後一個grid的時候很多之前的min已經被覆蓋了啊!我稍後會嘗試做一下正確的dp能不能寫出來,只dp到最後一個點的時候要加判斷。

我覺得更concise的是用DFS,思路非常清晰,就是一直深度探索,遍歷每一個點,然後一路下來保持最小值,到最後一個點與之前的最小值比誰大,誰大誰留下。

寫了代碼like this:

public int maxMin(int[][] matrix){
		if(matrix==null||matrix.length==0||matrix[0].length==0)
			return 0;
		max = Integer.MIN_VALUE;
		dfs(matrix,0,0,Integer.MAX_VALUE);
		return max;
		
	}
	
	private void dfs(int[][] mat, int i, int j, int minSoFar){
		int m = mat.length , n = mat[0].length;
		//base case: reach out of bottom right
		if(i==m||n==j)
			return;
		//every new step, evaluate current node and previous min
		minSoFar = Math.min(mat[i][j], minSoFar);
		//when reach final grid, return the bigger one 
		if(i==m-1 && j==n-1) {
            max = Math.max(minSoFar, max);
		} 
		
		dfs(mat, i+1, j, minSoFar);
		dfs(mat, i, j+1, minSoFar);
		
	}

這裏寫給自己DFS的關鍵思想:

1. 寫base case,探索到最後了要怎麼辦。這道題目就是,return,再往下不用管了。

2. 寫正常的非base case你要怎麼操作。這道理裏就是更新到這個點的最小值,是目前爲止的最小值還是這個點更小。

3. 如果有特殊需求,加if寫。在這道理裏就是如果探索到最後一個點了,開始判斷最大值。

4. DFS都是recursive,繼續探索下面的level。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章