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

写在前面的话: 养成做题的好习惯。焦灼,很烦。只想把论文整完。多看书写代码,就不焦灼了。so~
做题时间: 2020年3月23日~2020年3月29日
记录: 总共7道题,时间为362min。
最近更新时间: 202003229

地图分析

链接:https://leetcode-cn.com/problems/as-far-from-land-as-possible/
类名:
考察点: 动态规划
解题过程:力扣3月每日1题
看到这题目,感觉可以用动态规划试试。N*N个格子,0表示海洋,1表示陆地,距离是『曼哈顿距离』( Manhattan Distance):(x0, y0) 和 (x1, y1) 这两个区域之间的距离是 |x0 - x1| + |y0 - y1| ,需要求得距离陆地最远的海洋区域的最近陆地的距离是多少,其实就是找到格子为0表示海洋的格子的距离最近的陆地的距离中的最大值。这个距离比较有趣。考虑一个格子的状态,当前格子的值为1时,跳过不考虑;格子的值为0时,当前格子距离最近陆地的距离取决上、下、左、右四个格子距离最近陆地的距离+1,四个方向距离中的较小值。刚开始我是四个方向一起考虑,然后WA了。重新分析后,才发现,需要分两步考虑,先考虑左上两个方向,然后再考虑右下两个方向(先考虑右下再考虑左上也行),因为右下两个方向如果没有陆地的话,就需要使用到左上两个方向的值,这样就能得出每个格子距离最近陆地的距离,然后取最大值即可。需要注意的是初始化值为1的格子的距离为0;值为0的格子的距离为201,因为题目限制N的最大值为100,因此海洋到陆地的最大距离为200,为了能取到这个最大距离,初始距离应该大于这个最大距离。

单词的压缩编码

链接:https://leetcode-cn.com/problems/short-encoding-of-words/
类名:
考察点: 字符串、字典树、前后缀
解题过程:力扣3月每日1题
通过观察样例,压缩单词就是判断一个字符串是否为另一个字符串的后缀,直接处理后缀也行,但我的感受处理前缀看着舒服些,于是分三步,第1步是翻转每个单词,第2步是对翻转后的单词按字典序排序,如果是相同前缀的字符串,则按照字符串长短降序排列(这样第一个单词就是相同前缀的字符串中最长的单词,算编码长度方便);第3步遍历排序后的字符串,取每种前缀的最长字符串长度+1添加到压缩编码长度中,即可求得最终的长度。还有种解决字符串前缀或者后缀问题的经典数据结构-字典树Trie树,判断叶子节点形成的单词长度总和+叶子节点个数即为所求编码长度(没做,没时间,待定)。

卡牌分组

链接:https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards/
类名:
考察点:数学、数组
解题过程:力扣3月每日1题
刚开始是记录每个数值出现的次数,判断次数是否相等,然而这种思路是不对的,比如1、2两个数字,1出现2次,2出现4次,可以分成三组,2个1为1组,2个2有2组。重新组织思路,第1步仍是遍历数组1次记录每个数值出现的次数,第2步则是计算相邻两个数出现的次数的最大公约数,将这次的最大公约数记录下来,作为下一次计算与相应数值出现的次数的最大公约数的操作数,当最大公约数小于2时或者当前数值出现的次数等于1时,则返回false,停止计算,否则重复第2步。

车的可用捕获量

链接:https://leetcode-cn.com/problems/available-captures-for-rook/
类名:
考察点: 模拟、数组
解题过程:力扣3月每日1题
第1步,找到白车的坐标;第2步,按照题意,白车每次可向上、下、左、右四个方向运动,直到遇到棋盘边缘、白色棋、和卒(不分黑白)即停止此方向的运动,统计遇到的卒数量即可。

三维形体的表面积

链接:https://leetcode-cn.com/problems/surface-area-of-3d-shapes/
类名:
考察点: 几何、数学
解题过程:力扣3月每日1题
一个立方体的表面积是6,n个立方体的总表面积是6n,假设重叠的面为m,则实际总表面积为6n-2m。而重叠的面的数量m,有2种情况,第1种情况是同一个格子内相邻的立方体,假设一个格子内有k个立方体,则重叠的面为(k-1)2;第2种情况是相邻格子重叠的面,固定一个格子,相邻的格子有上、下、左、右四个方面,为了避免重复计算重叠面,取两个方向(上左、上右、下左、下右),假设当前格子a个立方体,相邻格子b个立方体,则重叠的面为ab中的较小值2。最终重叠的面数量m等于前两种情况之和。

按摩师

链接:https://leetcode-cn.com/problems/the-masseuse-lcci/
类名:
考察点:动态规划
解题过程:力扣3月每日1题
典型的动态规划问题。找状态转移方程,定义dp数组含义,假设n个请求,dp[n][0]表示第n个请求不接受形成的最长预约时间,dp[n][1]表示第n个请求被接受形成的最长预约时间。分析题意,相邻的请求不能同时被接受,所以dp[n][1]=dp[n-1][0]+当前的请求时间,因为当前请求被接受,前一个请求肯定不会被接受;dp[n][0]=最大值(dp[n-1][0],dp[n-1][1]),
当前请求不被接受,前一个请求存在接受或者被接受两种可能性,取最大值。

最大BST子树(放弃待做)

链接:https://leetcode-cn.com/problems/largest-bst-subtree/
类名:
考察点: 二叉搜索树
解题过程:
有点做懵了,对二叉搜索树的性质不熟悉。实现思想就是遍历树的节点,判断是否能形成二叉搜索树,如果能则就计算当前节点形成的二叉搜索树的节点数,取最多的节点数。想得明白,并不代表代码写的明白。尴尬。

链表的中间节点

链接:https://leetcode-cn.com/problems/middle-of-the-linked-list/submissions/
类名:
考察点: 链表
解题过程:力扣3月每日1题
方法1,遍历链表获取链表长度,取长度的一半,再遍历一次链表即可获得中间节点;方法2,双指针遍历链表,一快一慢,慢指针最终指向的位置即为所求中间节点。

原文地址:https://www.cnblogs.com/ranh941/p/12555297.html