这种矩阵题现在第一反应就是用广度优先搜索做,类似之前算和0之间的距离那题。遍历矩阵,遇到 1 就将 1 改成 0,然后广度优先搜索找出 1 相邻的所有 1,这就是一个岛屿,以此类推。
1 | import collections |
没什么好说的,注意各种情况,识别到数字之后就一直要是数字。
1 | class Solution: |
首先将区间按起点由小到大排序,这样相邻的两个就能通过终点判断是否重合。
1 | class Solution: |
想了两种思路
0 位置的上下左右是 1, 上下左右中有跟 1 相邻的就是 2,以此类推,从 0 的坐标开始往上下左右四个方向扩散。如果我们把同意个距离的看作是一层,可以用一个队列依次存放每一层的坐标,直至每个坐标都被计算过。
1 | class Solution: |
从左上角开往右下角遍历矩阵,当前坐标的距离由左和上两个位置的值确定。遍历一遍后,再反过来从右下角开始往左上角遍历,当前坐标的距离根据右和下两个位置的值确定,比较这两次得出的值中较小的一个即为该点的距离。
看到顺序的链表就想到用倒序链表的方法做,折腾了半天
1 | class ListNode: |
最后面各种进位的处理应该还可以更清晰优雅一些,但是懒得搞了,感觉很蠢。翻了答案看到了小 tips,需要倒序处理的情况可以用栈。
1 | class Solution: |
不过就执行效率来看差不多。
]]>做出来倒是很简单,由于没有并发和特别的条件,测试数据量也不大。一开始搞错了,以为传入的 twitterId 就是自增的 id,结果其实是每条推的内容,所以增加了一个计数器去标记 id。
主要的考点应该是 多路归并 这个东西。我用的是排序,在数据量大的时候应该会有些问题。
1 | class Twitter: |
又是小学奥数。由等差数列求和公式$\cfrac{(首项 + 末项)×项数}{2}$ 可知,当首项为 1 的时候项数最多,又由于是连续正整数,$n^2 < (1+n)×n < (n+1)^2 $,那最大的 $n$ 就不大于 $\sqrt{2×target} + 1$。
由小到大遍历 $n$,可以求得首项。
1 | import math |
一开始以为是用递归,想了半天没想出来,偷看了一下答案。答案的思路跟递归类似,假设在当前 $i$ 时刻,$dp[i][0]$ 为当前预约不接的情况下最长预约时间,$dp[i][1]$ 则为接受当前预约的最长预约时间。
那很显然,由于不能接受相邻两个预约,$dp[i][1] = dp[i-1][0] + nums_i$
不接受当前预约的话,上一个预约接不接受都可以,$dp[i][0] = max(dp[i-1][0], dp[i-1][1])$
最后只要比较两种情况即可 $max(dp[i][0], dp[i][1])$
1 | class Solution: |
遍历一遍字符串,遇到跟上一个字符不同的字符时记录上一个字符的重复长度。
1 | class Solution: |
小学奥数题。主要思路就是等差数列求和 $\cfrac{(首项 + 末项)×项数}{2}$ 。可以用公式把每一个位置获得的总糖果数表示出来。我的方法稍微蠢了点,算了每一轮的总糖果数,其实可以直接求总共发了多少次糖果,除以每轮的人数就可以得出发了多少轮。
1 | class Solution: |
利用列表 remove 方法,检查 chars 中是否有足够的字母拼写 word
1 | class Solution: |
如果存在这样字符串,那它最大的长度就是这两个字符串长度的最大公约数。
1 | class Solution: |
官方解答中还给了一种巧妙的解法,如果 str1 + str2 == str2 + str1 的话,可以证明必定存在这样一个字符串,其长度为两个字符串长度的最大公约数。
]]>遍历一遍找到车的坐标,然后按上下左右四个方向循环一下看碰到的第一个棋子是什么。
1 | class Solution: |
问题不难,官方解答中给了一个方向数组的概念,上下左右是 (0, 1) (0, -1) (-1, 0) (1, 0),有点像向量的意思。走的路线等于方向数组乘以步数。
]]>将大牌堆分成多个牌数量相等的小牌堆,就是求每张牌数量的公约数。先遍历一遍得到每张牌的数量,然后找出比2大的公约数即可。
1 | class Solution: |
因为是整数数组,如果能均分成三份,则数组和肯定是3的倍数。然后遍历数组逐端求和使得和为 sum(A)/3。
1 | class Solution: |
思路是遍历一遍得到整个链表,讲每个 node 放进一个 list,就可以通过下标得到中间的。
1 | # Definition for singly-linked list. |
看官方解答,还有一个骚操作,通过两个速度不一样的指针,一个一次走一步,一个两次走一步,快的走到底时,慢的就在中间了。
1 | class Solution: |
看两个矩形有没有重叠,就看两个矩形在坐标轴上的投影有没有重叠。
1 | class Solution: |
一开始理解错题目了,以为是寻找字符串中的最长回文串,结果是构造。但是原理基本一样,由于回文中心对称,所以是由多个偶数个相同字母和至多一个奇数个相同字母组成。
这样只要数给出的字符串中有几个偶数个相同字母和几个奇数个相同字母就可以了。奇数个相同字母可以减少一个当偶数个用,最后再加回去一个。
1 | class Solution: |
这题做出来了但是没有通过运行时间的测试,主要还是没想明白二叉树的直径到底是什么东西,用了个蠢办法。
1 | # Definition for a binary tree node. |
L43 之前做的是以深度优先的方式遍历一遍树,得出每个点的路径。后面的是将所有路径组合在一起得出任意两个点间的路径,算出最大长度。
其实以某个点为根节点的树的直径,就是某个节点的左子树的深度和右子树的深度的和,用递归来处理这个会比较容易理解
1 | class Solution(object): |
注意栈是 FILO(First In Last Out),Python 的 list 是 FIFO(First In First Out)。
1 | class MyStack: |