36. Valid Sudoku
数独,题目要求,每一行,每一列,每个小的九宫格不能出现同样的数字(数字为0~9),
算法思想:
(1)判断每一行有没有相同的数字
(2)判断每一列有没有相同的数字
(3)每个小的九宫格有没有相同的数字。
//稍微需要考虑的是对于9X9的九宫格应该怎么遍历每一个3X3的九宫格
64. Minimum Path Sum
题目:给定一个矩阵,怎么计算从左上角走到右下角,经过的每个格子相加最小为多少
算法思想:
要最小,只能往下或者往右走,否则走多了。
方法1:naive method
采用迭代的思想:从左上角开始加上min(其右侧,其下侧),如果迭代到最右列,只需要加上其下侧,如果迭代最下行,只需要加上其右侧
但是这种方法比较耗时
方法2:
建立一个和给定矩阵同等size的矩阵
新矩阵[0][0](即起始位置)=给定矩阵的初始位置
之后矩阵每个格子的值为其上侧和左侧的较小值+给定矩阵在这个位置上的值。如果到最后侧(取上侧+给定矩阵的此位置上的值),如果到最下侧(取左侧的值加上给定矩阵的此位置上的值)
最后,新矩阵的右下角的值就是做过的各路径的sum的最小值
62. Unique Paths
题目:给定一个矩阵,从左上角到右下角有几种走法(只能往下或者往右走)
算法思想:
如果用迭代的思想解,耗时长
方法:
跟上面的思想相似
建立同等大小的新矩阵
初始化第一行(第一行的值均为1,因为他们只能从左边走过来)
初始化第一列(第一列的值均为1,……)
其他位置上的值:新矩阵上面的值(到上面的位置有几种走法)+新矩阵左边的值(到左边的位置有几种走法)
右下角的值就是一共能有几种走法
63. Unique Paths II
上面的题目中,加入了遮挡,即某位为1,不能走,
算法思想:
如果左上角或者右下角为1,出发和结束被阻塞了,永远走不通,返回0
否则,建立同等大小的新矩阵
初始化第一行,如果给定矩阵第一行某位为1,则新矩阵对应位置置0,否则该位的值等于新矩阵中其左侧的值(如果其左侧为0,它的值也应该为0)
初始化第一列,同理
其他位置,如果不为0,新矩阵该位为新矩阵中该位上面和左边的值相加,否则置0
返回新矩阵右下角的值
200. Number of Islands
题目:矩阵中1表示陆地,0表示水,被水围绕的是岛屿,陆地连接这的话表示同一块岛屿(围绕和连接指的是上下左右,不涉及对角)
算法思想:
如果某个位置上为1,则count++,同时连接其上下左右的陆地
怎么连接上下左右的陆地?
只要遍历一遍,碰到一个1,就把它周围所有相连的1都标记为非1,这样整个遍历过程中碰到的1的个数就是所求解。
130. Surrounded Regions
题目:将被X围起来的区域置为X
解析:
在四边的O肯定是没有包围起来的,所以可以从周边的O开始BFS搜索。
但是这里注意的是直接迭代的话,会出现java.lang.StackOverflowError错误,因为当矩阵很大的时候,就会有很多个嵌套的bfs方法
所以这里引入queue来做BFS算法。主要是将从周边开始的‘O’的位置加入到queue中。当queue不为空时,进行bfs查找。
Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Queue接 口。Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类型如果是Queue时,就完全只能访问Queue接口所定义的方法 了,而不能直接访问 LinkedList的非Queue的方法),以使得只有恰当的方法才可以使用。BlockingQueue 继承了Queue接口
Queue的常用方法:
add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
offer 添加一个元素并返回true 如果队列已满,则返回false
poll 移除并返问队列头部的元素 如果队列为空,则返回null
peek 返回队列头部的元素 如果队列为空,则返回null
put 添加一个元素 如果队列满,则阻塞
take 移除并返回队列头部的元素