刷題-力扣-面試題 08.10. 顏色填充
阿新 • • 發佈:2022-03-03
題目連結
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/color-fill-lcci
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
題目描述
編寫函式,實現許多圖片編輯軟體都支援的「顏色填充」功能。
待填充的影象用二維陣列 image 表示,元素為初始顏色值。初始座標點的行座標為 sr 列座標為 sc。需要填充的新顏色為 newColor 。
「周圍區域」是指顏色相同且在上、下、左、右四個方向上存在相連情況的若干元素。
請用新顏色填充初始座標點的周圍區域,並返回填充後的影象。
示例:
輸入: image = [[1,1,1],[1,1,0],[1,0,1]] sr = 1, sc = 1, newColor = 2 輸出:[[2,2,2],[2,2,0],[2,0,1]] 解釋: 初始座標點位於影象的正中間,座標 (sr,sc)=(1,1) 。 初始座標點周圍區域上所有符合條件的畫素點的顏色都被更改成 2 。 注意,右下角的畫素沒有更改為 2 ,因為它不屬於初始座標點的周圍區域。
提示:
- image 和image[0]的長度均在範圍[1, 50] 內。
- 初始座標點 (sr,sc) 滿足0 <= sr < image.length 和0 <= sc < image[0].length 。
- image[i][j] 和newColor表示的顏色值在範圍[0, 65535] 內。
題目分析
- 根據題目描述,將相鄰切相同顏色的格子,改變顏色
- 廣度優先搜尋,將相鄰區域切顏色相同的位置改變顏色
程式碼
class Solution { public: vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int newColor) { if (newColor == image[sr][sc]) { return image; } floodFill(image, sr, sc, newColor, image[sr][sc]); return image; } private: void floodFill(std::vector<std::vector<int>>& image, int sr, int sc, int newColor, int oldColor) { if (sr < 0 || sr >= image.size() || sc < 0 || sc >= image[sr].size()) { return; } if (image[sr][sc] == newColor) { return; } if (image[sr][sc] == oldColor) { image[sr][sc] = newColor; floodFill(image, sr - 1, sc, newColor, oldColor); floodFill(image, sr + 1, sc, newColor, oldColor); floodFill(image, sr, sc - 1, newColor, oldColor); floodFill(image, sr, sc + 1, newColor, oldColor); } return; } };