影象渲染 【leetcode - 733 - 簡單】
阿新 • • 發佈:2019-01-06
文章優先發表在個人部落格
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; } }