leetcode.733 圖像渲染

文章優先發表在個人博客

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 

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