15天算法入门(七)

简介: 本文主要讲图像渲染和岛屿的最大面积

网络异常,图片无法展示
|


网络异常,图片无法展示
|


图像渲染


题目


有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间。


给你一个坐标 (sr, sc) 表示图像渲染开始的像素值(行 ,列)和一个新的颜色值 newColor,让你重新上色这幅图像。


为了完成上色工作,从初始坐标开始,记录初始坐标的上下左右四个方向上像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应四个方向上像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜色值改为新的颜色值。


最后返回经过上色渲染后的图像。

示例 1:
输入: 
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,
因为它不是在上下左右四个方向上与初始点相连的像素点。


题解


题目很长,我读了很久才搞明白要求。在给定点位置的上下左右,并且四个方向的值要和给定点的值相同。这样给定点变成新值后,四个方向的值也要跟着改变。 之后,再以四个方向的点分别作为定点,找各自的上下左右,值相同的,将其变成新值。依次类推。


思路:

题目理清楚了,思路既然也就有了。首先肯定存在对上下左右四个方向的递归过程。

  • 新值和原来的值相同,直接返回原数组。
  • 不同。从这个点开始向上下左右四个方向依次扩散。四个方向上和中间点的值相同时,就需要将其和中间点一样改成新值。
  • 扣边界。在递归过程中,如果中间点的四个方向在最外一圈的,再向外扩散就超界的情况可以直接返回
  • 定点值和当前点值不同是不需要改变的。


代码


var floodFill = function (image, sr, sc, newColor) {
    let m = image.length, n = image[0].length, oldColor = image[sr][sc]
    if (oldColor == newColor) return image
    let fill = (i, j) => {
        if (i < 0 || j < 0 || i >= m || j >= n || image[i][j] != oldColor) return
        image[i][j] = newColor
        fill(i + 1, j)
        fill(i - 1, j)
        fill(i, j + 1)
        fill(i, j - 1)
    }
    fill(sr, sc)
    return image
};


岛屿的最大面积



题目


给定一个包含了一些 0 和 1 的非空二维数组 grid 。


一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。

找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。)

 

示例 1:
[[0,0,1,0,0,0,0,1,0,0,0,0,0],
 [0,0,0,0,0,0,0,1,1,1,0,0,0],
 [0,1,1,0,1,0,0,0,0,0,0,0,0],
 [0,1,0,0,1,1,0,0,1,0,1,0,0],
 [0,1,0,0,1,1,0,0,1,1,1,0,0],
 [0,0,0,0,0,0,0,0,0,0,1,0,0],
 [0,0,0,0,0,0,0,1,1,1,0,0,0],
 [0,0,0,0,0,0,0,1,1,0,0,0,0]]


对于上面这个给定矩阵应返回 6。注意答案不应该是 11 ,因为岛屿只能包含水平或垂直的四个方向的 1 。


题解


这题和上题,较为类似。上题是给定点,依次向外扩散;而这题是求最多的有多少点四个方向相连。可以通过循环遍历去求,但是在递归过程中我们需要将递归过的点变为0,避免在此循环重复。


遍历:当点为1时,进行递归操作,寻找最大面积。从当前点向上下左右四个方向依次扩散递归。需要注意的还是边界问题(递归终止条件)。除了四个方向不越界之外,当前递归点不为0的情况。


代码


var maxAreaOfIsland = function (grid) {
    let m = grid.length, n = grid[0].length, maxArea = 0
    const Island = (i, j) => {
        if (i < 0 || j < 0 || i >= m || j >= n || grid[i][j] == 0) return 0
        grid[i][j] = 0
        let max = 1
        max += Island(i + 1, j)
        max += Island(i - 1, j)
        max += Island(i, j - 1)
        max += Island(i, j + 1)
        return max
    }
    for (let i = 0; i < m; i++) {
        for (let j = 0; j < n; j++) {
            if (grid[i][j] == 1) {
                maxArea = Math.max(maxArea, Island(i, j))
            }
        }
    }
    return maxArea
};


题目来源:leetcode

目录
相关文章
|
1月前
|
机器学习/深度学习 人工智能 算法
AI入门必读:Java实现常见AI算法及实际应用,有两下子!
本文全面介绍了人工智能(AI)的基础知识、操作教程、算法实现及其在实际项目中的应用。首先,从AI的概念出发,解释了AI如何使机器具备学习、思考、决策和交流的能力,并列举了日常生活中的常见应用场景,如手机助手、推荐系统、自动驾驶等。接着,详细介绍了AI在提高效率、增强用户体验、促进技术创新和解决复杂问题等方面的显著作用,同时展望了AI的未来发展趋势,包括自我学习能力的提升、人机协作的增强、伦理法规的完善以及行业垂直化应用的拓展等...
148 3
AI入门必读:Java实现常见AI算法及实际应用,有两下子!
|
2月前
|
机器学习/深度学习 数据采集 人工智能
机器学习算法入门与实践
【7月更文挑战第22天】机器学习算法入门与实践是一个既充满挑战又极具吸引力的过程。通过掌握基础知识、理解常见算法、注重数据预处理和模型选择、持续学习新技术和参与实践项目,你可以逐步提高自己的机器学习技能,并在实际应用中取得优异的成绩。记住,机器学习是一个不断迭代和改进的过程,保持好奇心和耐心,你将在这个领域走得更远。
|
2月前
|
消息中间件 存储 算法
实战算法的基础入门(2)
实战算法的基础入门
|
2月前
|
算法 大数据
实战算法的基础入门(1)
实战算法的基础入门
|
1月前
|
存储 算法
【C算法】编程初学者入门训练140道(1~20)
【C算法】编程初学者入门训练140道(1~20)
|
2月前
|
算法 Java
实战算法的基础入门(3)
实战算法的基础入门
|
3月前
|
算法 程序员
高阶算法班从入门到精通之路
高阶算法班从入门到精通之路
30 3
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
机器学习算法入门:从K-means到神经网络
【6月更文挑战第26天】机器学习入门:从K-means到神经网络。文章涵盖了K-means聚类、逻辑回归、决策树和神经网络的基础原理及应用场景。K-means用于数据分组,逻辑回归适用于二分类,决策树通过特征划分做决策,神经网络则在复杂任务如图像和语言处理中大显身手。是初学者的算法导览。
|
3月前
|
自然语言处理 算法
ransformers从入门到精通:常用的subword tokenizer算法
- WordPiece、BPE/BBPE最小字词进行合并最终字词,BPE/BBPE直接采用词频判断合并规则而WordPiece采用最大似然的方式 - unigram采用从最大的字词集合里移除那些对语料库整体概率贡献最小的子词【6月更文挑战第7天】
75 3
|
3月前
|
存储 自然语言处理 算法
位运算入门及简单算法题的应用
位运算入门及简单算法题的应用
26 1