文章優先發表在個人博客
http://www.xdx97.com/#/single?bid=048c0fd8-e6c2-8e30-91f1-5737f39f0a27
胡扯:這個題在評論區有人說看不懂,我個人覺得還比較好理解。建議遇到不太好理解的題目的時候,動手拿筆寫寫畫畫,有助於理解。日常吐槽 leetcode 不可以用全局變量的問題。明明說是 c/c++,不可以,但是我用的是java啊。
題目地址 :https://leetcode-cn.com/problems/flood-fill/
還有個問題,就是有時候那個執行時間不必去在意。當然很大程度是你的算法不夠好。但我今天同樣的代碼,提交多次,出現了相差十幾秒的情況。
思路:
1、在每一個位置進行前後左右的移動。這個題移動的時候需要判斷一下,當下一個點不具備 改變的可能的時候,也就是不等於最開始位置的值,我們不需要對它進行遞歸。
2、在每一個位置我們是否需要對它進行重新賦值的標準是,它的上下左右是否有 newColor,所以對於每一個可能 賦值 的位置,我們都需要進行一個判斷。
3、我們優先處理當數組爲空的時候,直接返回該數組。
4、我們在主方法裏面,要進行處理把起始位置,進行開始的賦值。 不然進入遞歸的時候,可能出現它的上下左右沒有newColor ,但是很明顯起始位置不需要進行這樣的判斷。
5、我們需要對每一個位置進行存儲起來,表示我們是否已經走過該路線,用 set 很合適。
代碼
class Solution {
int[][] move = {{0,-1},{0,1},{-1,0},{1,0}}; //上下左右移動
public void dfs(int[][] arr, int r, int c,int ini,int newColor,Set<String> set){
//判斷當前 的點是否需要變色
for (int i = 0;i < 4; i++){
int newr = r + move[i][0];
int newc = c + move[i][1];
if (newr >= 0 && newc >= 0 && newr < arr.length && newc < arr[0].length){
if(arr[newr][newc] == newColor){
arr[r][c] = newColor;
break;
}
}
}
//遞歸的去判斷下面那些點可能變色
for (int i = 0;i < 4; i++){
int newr = r + move[i][0];
int newc = c + move[i][1];
if (newr >= 0 && newc >= 0 && newr < arr.length && newc < arr[0].length){
if ( set.contains(""+newr+newc) )
continue;
set.add(""+newr+newc);
if (arr[newr][newc] == ini)
dfs(arr,newr,newc,ini,newColor,set);
}
}
}
public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
if(image.length == 0 && image[0].length == 0)
return image;
Set<String> set = new HashSet<>(); //用來存放走過的路線
int ini = image[sr][sc]; //最開始的數值
image[sr][sc] = newColor;
set.add(""+sr+sc);
dfs(image,sr,sc,ini,newColor,set);
return image;
}
}
---------------------
作者:小道仙
來源:CSDN
原文:https://blog.csdn.net/Tomwildboar/article/details/85781883