• 2020年3月第1周做题记录(力扣)


    写在前面的话: 一周更新一篇,赶论文,赶项目,1月2月做题记录还在整理,自我训练,不喜勿喷,谢谢
    做题时间:2020年3月1日~2020年3月8日
    记录:共20道题,1233分钟
    最近更新时间:20200308

    零钱兑换

    链接:https://leetcode-cn.com/problems/coin-change/
    类名:
    考察点: 动态规划
    解题过程:力扣3月每日1题
    很典型的动态规划问题(递归或者迭代),我感觉递归好理解一些。找状态转移方程,明确dp数组的含义,dp[i]表示凑金额i需要的最少硬币数,1<=i<=目标金额,确定转移条件(当前金额数减去选择的硬币金额+1)与出口(当硬币数为0时,不需要硬币;硬币数为负时,则返回-1)。递归的话需要备用录避免重复计算,否则提交超时。.

    T秒后青蛙的位置

    链接:https://leetcode-cn.com/problems/frog-position-after-t-seconds/
    类名:
    考察点: 树、深搜、回溯
    解题过程:
    力扣周赛中的题,很尴尬,能看出题目类型属于深搜回溯,然而代码不够熟练,提交失败14次,第15次才成功。卡助我的地方在考虑循环跳出的条件,要求青蛙在T秒时处于target节点,其中需要注意的是,如果是target为叶子节点话,青蛙可以停在原地。总结青蛙T秒后跳的情况就是,超过T秒,没找target,失败;没超过T秒,(1)若为叶子节点,则原地跳,成功,否则失败;(2)若不是叶子节点,则需要刚好为t秒时,到达target节点,成功;否则失败。

    寻找二叉树的叶子节点

    链接:https://leetcode-cn.com/problems/find-leaves-of-binary-tree/
    类名:
    考察点:树、递归
    解题过程:
    找到叶子节点,将其父子节点指向此节点指针变为空,从左子树到右子树依次找叶子节点,这是1轮删除。重复上述操作,直到删除动作返回值为空,表示该二叉树删除干净了。

    队列的最大值

    链接:https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof/
    类名:
    考察点:
    解题过程:力扣3月每日1题
    用双队列实现的。queue保存数据,deque保存递减的最大值。复杂度,我挺没看明白,为啥pushpopmax都是O(1)。push时,需要循环遍历deque确保维持递减的最大顺序,这怎么也应该是O(n)。用数组或者链表来模拟队列也是可以的,需要记录元素个数、队列起始位置。

    在D天内送达包裹的能力

    链接:https://leetcode-cn.com/problems/capacity-to-ship-packages-within-d-days/
    类名:
    考察点: 二分查找
    解题过程:
    船的容量范围从1次包裹最重的重量到所有包裹的总量和,需要在其中找一个最小容量满足所有包裹能在D天内运输完。很典型的寻找左侧边界的二分查找(左开右闭)。套用模板。
    arr为包裹重量,d为天数
    left = 最重的包裹,right=所有包裹总和+1
    while(left<right){
    mid = left+(right-left)/2;
    if(checkDay(mid)){//能够在容量为mid时,d天内运输完,缩小右边界(上限)
    right=mid;
    }eles{//不能在容量为mid时,d天无法运输完,提高容量,扩大左边界(下限)
    left = mid+1;
    }
    }

    序列化和反序列化N叉树(放弃待做)

    链接:https://leetcode-cn.com/problems/serialize-and-deserialize-n-ary-tree/
    类名:
    考察点: 树、序列化、反序列化
    解题过程:一直报空指针报错,逗我呢。

    和为s的连续正数序列

    链接:https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/
    类名:
    考察点: 数学、等差数列
    解题过程:力扣3月每日1题
    //sum = na1+(n-1)nd/2 d为差值 a1为等差数列第1个值 n为元素个数
    //target=(n
    n-n+a1n)/2
    //二次方程求解
    //0 = n
    n+(2a1-1)n-2target
    //a=1
    //delta = (2a1-1)^2+8target
    //-b= 1-2a1,a1>=1, 2a1-1>=0,-b一定小于等于0
    //-b-delat小于等于0,-b+delta大于等于0,不考虑delta为0的情况
    //n=(delta-b)/2
    两个知识点,等差数列求和与一元二次方程的求解公式。能分解成的数列第1个元素范围为1~(target+1)/2,不包括结束为止,合法的数列第1个元素就是等差数列的第1个元素,n为当前等差数列的长度,通过n与target求n。需要注意的点是一元二次方程求delta时小心数值过大会溢出,int换成long即可。

    寻找重复的子树

    链接:https://leetcode-cn.com/problems/find-duplicate-subtrees/
    类名:
    考察点: 树、序列化、递归
    解题过程:
    以每个节点作为根节点的树用一个唯一字符串来标识,用一个哈希表保存唯一标识出现的次数,当该标识第2次出现时,则放到作为返回值的数据结构中,并更新该标识出现次数为2,从而避免反复添加重复的子树的根节点。

    回文素数(待做)

    链接:https://leetcode-cn.com/problems/prime-palindrome/
    类名:
    考察点: 回文数、素数
    解题过程:暴力没搞定,头大。看题解也头大,没时间,待定。

    分糖果

    链接:https://leetcode-cn.com/problems/distribute-candies-to-people/
    类名:
    考察点: 数组、数学
    解题过程:力扣3月每日1题
    刚开始想到分配一次糖果是个数学中的等差数列问题,可以用数学公式来做。但,我选择暴力,不用脑子。所以模拟分配糖果的过程,直到分配的糖果总数大于等于实际可分配的糖果数,而最后一次分配的糖果数则需要减去多分配的糖果数(期望分配的糖果数与实际可分配糖果差)。

    岛屿数量

    链接:https://leetcode-cn.com/problems/number-of-islands/
    类名:
    考察点: 广度优先搜索
    解题过程:
    从第一个节点开始遍历,遇到值为1且未被遍历过的节点,则以此节点为根节点开始遍历该点可达的其他为1的节点,与此同时标记被遍历的节点,重复上述过程,重复的次数即为所求的岛屿数。

    在每个树行中找最大值

    链接:https://leetcode-cn.com/problems/find-largest-value-in-each-tree-row/
    类名:
    考察点: 层次遍历、宽度优先搜索
    解题过程:
    考擦树的基本操作,宽度优先搜索(层次遍历)。用队列实现,在每层搜索时,记录每层最大值放到指定的数据结构中即可。

    腐烂的橘子

    链接:https://leetcode-cn.com/problems/rotting-oranges/
    类名:
    考察点:
    解题过程:力扣3月每日1题
    第1,步,用一个二维数组记录每个位置是否被遍历过,空的节点初始化为被遍历了,记录好橘子个数,若好橘子为0,则结束;第2步,广度优先搜索,将坏的橘子节点放到队列中,搜索每个橘子上下左右四个方向的橘子,标记被遍历的节点,同时记录被感染坏的橘子;第3步,判断感染坏的橘子个数和好橘子个数是否相等,相等则表示没有好橘子,结束,否则重复第2步;第4步,没通过第3步结束,就表示橘子不能都被感染完,返回-1。

    最长有效括号

    链接:https://leetcode-cn.com/problems/longest-valid-parentheses/
    类名:
    考察点: 字符串、动态规划
    解题过程:
    括号总是成对出现,一个左括号,一个右括号。题目要求最长的包含有效括号的子串的长度。思路分为三步,第一步的话,扫描字符串,确定每个位置如果是右括号的话,是否存在以此为结尾存在的括号,标记该括号左右括号所在的位置,第二步的话则是找到以每个位置为结尾的最多连续标记次数,第三步则是取最大的最连续标记次数就是最长有效括号。

    合并排序的数组

    链接:https://leetcode-cn.com/problems/sorted-merge-lcci/submissions/
    类名:
    考察点: 数组
    解题过程:力扣3月每日1题
    方法1,图睡觉,既然A的空闲空间充足,就把B的数据添加到A后面,然后排序。这样空间复杂度为O(m+n),时间复杂度取决于排序算法。这样没有利用上题目给出的A、B数组都有序这个条件。方法2,A、B都有序,利用一个中间数组,存储A、B指向位置中较小的值,时间与空间复杂度都是O(m+n)。应该还有空间复杂度为1的,之前看见过,不去想了,没时间。

    反转链表

    链接:https://leetcode-cn.com/problems/reverse-linked-list/
    类名:
    考察点:链表、迭代、递归
    解题过程:
    力扣3月每日1题,题解链接:
    https://leetcode-cn.com/problems/reverse-linked-list/solution/di-2ci-da-qia-lian-biao-fan-zhuan-di-gui-by-wu-xi-/
    就是记录当前的节点的前一个位置,改变当前节点指向的位置为访问的前一个节点,第一个节点指向null,最后个节点成了根节点。符合递归思想。递归和迭代都要考虑到如何记录前一个遍历的节点位置,迭代用临时变量保存,而递归则是参数列表中的1个参数保存。

    二叉树中所有距离为 K 的结点

    链接:https://leetcode-cn.com/problems/all-nodes-distance-k-in-binary-tree/
    类名:
    考察点: 树、递归、深搜、回溯
    解题过程:
    刚开始只考虑所求节点相等值的节点的左右子树,没考虑到当前节点的父亲节点方向。后来用个哈希表保存当前节点的父子节点,然后广度优先搜索当前节点的父亲节点、左右节点方向,由于搜索时需要回溯,避免走过的方向重复走,用set保存走过的节点,每次递归记录走的路径长度,直到走的长度与题目要求相等且当前节点值为题目要求的值,则当前遍历的子树根节点即为满足要求的节点。折腾了快2h,还是终于整出来了。虽然用时和内存 消耗感人。

    用队列实现栈

    链接:https://leetcode-cn.com/problems/implement-stack-using-queues/
    类名:
    考察点: 队列、栈
    解题过程:
    考虑栈的特点是先进后出,队列的特点是先进先出。所以选择用两个队列来模拟栈的行为。
    始终维持一个队列为空,将空队列作为数据在另一个队列模拟栈行为的中转区域(不知道用什么词来描述)。
    1、push:哪个队列为空,则插入到另一个队列中;
    2、pop:将非空队列A的数据一个个取出放到空队列B中,当非空队列还剩最后1个元素时,就是栈顶元素,由于需
    要移除该值,所以非空队列A的最后一个元素不放到原空队列B中;
    3、top:和pop行为很像,唯一不同的点就是作为栈顶的元素只是取其值,而不用移除,因此选择用临时变量来
    保存每次移动的值;
    4、empty:判断两个队列是否为空即可。
    力扣3月每日1题,题解链接:
    https://leetcode-cn.com/problems/implement-stack-using-queues/solution/di-1tian-da-qia-by-wu-xi-4/

    另一个树的子树

    链接:https://leetcode-cn.com/problems/subtree-of-another-tree/
    类名:
    考察点: 树、递归
    解题过程:还是得多做树相关的题。
    树A,树B,判断树B是否是树A的子树,此处子树意思从A处某个节点断开形成的树节点个数与位置与树B相同。一步步来分析,遍历树A的每个节点,假设以每个节点作为根节点,判断以此节点 形成的左子树或者右子树是否与树B相同,判断的过程又是一次独立迭代,对以此节点为根节点的左右子树节点与树B对应的子节点做比较。

    二叉树中的链表

    链接:https://leetcode-cn.com/problems/linked-list-in-binary-tree/
    类名:
    考察点: 树、递归
    解题过程:
    和“另一个树的子树”解题几乎一模一一样。唯一需要注意的一点就是,当判断的树B为空,而待判定的树树A不为空时,应为真。

  • 相关阅读:
    noi.ac 集合
    NOI2019 SX 模拟赛 no.5
    带花树草解
    UR#13 SRAND
    【51nod1847】 奇怪的数学题
    ●POJ 3237 Tree
    ●BZOJ 2049 [Sdoi2008]Cave洞穴勘测
    ●BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊
    ●POJ 2983 Is the Information Reliable?
    ●POJ 3378 Crazy Thairs
  • 原文地址:https://www.cnblogs.com/ranh941/p/12398987.html
Copyright © 2020-2023  润新知