【LeetCode】图像渲染(BFS/DFS)

【LeetCode】图像渲染(BFS/DFS)

题目:
有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间。
给你一个坐标 (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, 因为它不是在上下左右四个方向上与初始点相连的像素点。

BFS
剪枝去重一层一层的加入到队列中。

 public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
        Queue<Integer> queue = new LinkedList<Integer>();
		int size = 0;
		int target = image[sr][sc];
		image[sr][sc] = newColor;
		queue.add(sr*image[sr].length+sc);
		while(!queue.isEmpty()) {
			size = queue.size();
			for(int i=0;i<size;i++) {
				int count = queue.poll();
				int row = count/image[sr].length;
				int col = count%image[sr].length;
				
				int up = row-1;
				int down = row+1;
				int left = col-1;
				int right = col+1;
				
				if(up>=0&&image[up][col]!=newColor&&image[up][col]==target) {
					image[up][col] = newColor;
					queue.add(up*image[sr].length+col);
				}
				if(down<image.length&&image[down][col]!=newColor&&image[down][col]==target) {
					image[down][col] = newColor;
					queue.add(down*image[sr].length+col);
				}
				if(left>=0&&image[row][left]!=newColor&&image[row][left]==target) {
					image[row][left] = newColor;
					queue.add(row*image[sr].length+left);
				}
				if(right<image[sr].length&&image[row][right]!=newColor&&image[row][right]==target) {
					image[row][right] = newColor;
					queue.add(row*image[sr].length+right);
				}
			}
		}
		
		return image;
    }

DFS
使用工具栈完成。

	 public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
		Stack<Integer> stack = new Stack<Integer>();
		int target = image[sr][sc];
		stack.add(sr*image[sr].length+sc);
		while(!stack.isEmpty()) {
			int num = stack.pop();
			int row = num/image[sr].length;
			int col = num%image[sr].length;
			
			if(row-1>=0&&image[row-1][col]==target&&image[row-1][col]!=newColor)//上
				stack.add((row-1)*image[row-1].length+col);
			if(row+1<image.length&&image[row+1][col]==target&&image[row+1][col]!=newColor)//下
				stack.add((row+1)*image[row+1].length+col);
			if(col-1>=0&&image[row][col-1]==target&&image[row][col-1]!=newColor)
				stack.add(row*image[row].length+col-1);//左
			if(col+1<image[row].length&&image[row][col+1]==target&&image[row][col+1]!=newColor)
				stack.add(row*image[row].length+col+1);//右
			
			image[row][col] = newColor;
		}
		
		return image;
    }

使用递归完成(系统栈)
设计递归条件与终止条件。

	static int target = 0;
    public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
        target = image[sr][sc];
		return DFS(image,sr,sc,newColor); 
    }

    public int[][] DFS(int[][] image, int sr, int sc, int newColor){
		if(target!=image[sr][sc]||newColor==image[sr][sc]) {
			return image;
		}
		
		image[sr][sc] = newColor;
		if(sr-1>=0)DFS(image,sr-1,sc,newColor); //上
		if(sr+1<image.length)DFS(image,sr+1,sc,newColor);//下
		if(sc-1>=0)DFS(image,sr,sc-1,newColor);  //左
		if(sc+1<image[sr].length)DFS(image,sr,sc+1,newColor);//右
		
		return image;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值