My code on LeetCode
还未解决。
找规律的题目,O(n)就能解决。
最简单的就是O(n2)的算法,但是TLE,需要找更快的算法。
因为面积大小跟两点高度和距离有关,而高度又是取两点中较低的那个,所以可以用贪心的方法做。
选取最远的两个点,做两个指针,向中间移动,如果移动较高的点,面积不可能比当前还大,所以每次只要移动较低的那个点就行了,算法复杂度O(n)。
找到列表中所有三个相加和为0的子集。 首先想到的方法是遍历两个数,然后直接找列表中是否有毎两个数相加后与0的差的那个值,若有就说明找到一个子集。理论上是复杂度是O(n2),但是写出来一个68ms就能跑出来的答案还是TLE了。 最后看Discuss,题解是排序后固定第一个数,然后找到另外两个数,十分巧妙,但也是O(n2)的复杂度。不过精确算起来是比我的方法复杂度要低的。
和上一题的思路一样
简单的链表问题
用最小堆做一个排序,代码里自己实现了最小堆。
实际上python的queue库里也有priority queue函数可以直接用。
简单的链表处理
比上一题复杂一些的链表,思路就是遍历k的转换范围内的链表,每一个结点依次移到这段链表的头部就行了。
用最普通的字符串遍历方式,复杂度是0(words*s),TLE了,需要更快的算法。
找到下一个排列的规律就可以了,注意考虑重复数字的情况。
处理括号对齐的问题,一看就是用栈操作,但是开始没有找到好的统计匹配子串的方法。 看了题解,其实方法很简单,栈内保存括号的index就行了,遍历一遍之后栈内剩下的index之间差值就是匹配子串长度。
分两次遍历。先遍历一次,找到下降的部分,把这部分去掉再遍历一次。