您的位置:首页 > 其它

LeetCode算法思想

2016-03-27 19:56 246 查看

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        移除并返回队列头部的元素    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: