mark
bengepai
这个作者很懒,什么都没留下…
展开
-
Leetcode 238
此题想要返回的是一个数组中每个元素除自身以外其他元素的乘积,并且不能使用除法操作。要求O(n)的时间复杂度,我们可以梳理一下,对于一个数组而言,采用O(n)的时间复杂度可以得到哪些东西:最大最小值均值求和,每个位之前的求和求最大最小和均值。正是使用这些O(n)能够得到这些最基本的信息,来构建整个题目的解。一开始我采用的是类似递归的思想来进行求解,发现这样做会使得复杂度更高。我们将整个问题拆分,既然...原创 2019-12-26 11:21:15 · 119 阅读 · 0 评论 -
Leetcode 11
此题是一道非常经典的算法题。给定一系列高度的横线,算其所能围成的盛水容器的面积最大多少。可以直观地发现整个盛水面积是与两个横线之间的距离以及他们的最小高度决定的。一个非常直观的想法是遍历两两线段,取最大的面积,但是这样做很明显是超时的,所以一定有更加简单的方法来处理,也就是有一些情况是不需要考虑的。由于暴力遍历的时间复杂度是O(n^2),由于二分的方式并不明显,所以考虑O(n)复杂度的算法。...原创 2019-12-24 21:17:17 · 356 阅读 · 0 评论 -
leetcode 979
mark,这题没做出来。题目意思是给定一棵树,每个节点都有一个数字,代表星星的数量,最少需要移动多少次能够使得每个节点上面的星星数量都为1。这题的关键是考虑想要定义的递归函数的意义是什么。我们将问题进行分解,一共需要移动多少次,其实等价于每个节点出去或进来的次数的总和。那么我们就可以定义递归函数为针对该节点其出去或进来的次数。这个次数就相当于左右节点的次数 加上 root.val -1。其中 ...原创 2019-10-16 21:21:43 · 159 阅读 · 0 评论 -
LeetCode 114
mark,好题目! 题目要求将一个二叉树按照前序遍历的方式展开成一个新树,要求就在此棵树上面进行修改,也就是不能占用额外的空间。递归是直观的解法,但是会占用额外的存储空间,因为每一层递归都会保留左右子树相关的信息,空间复杂度不是常数。可以发现,右子树的所有节点都一定在左子树最右边节点的后面!所以该题的核心关键所在就是每次找到左子树中最右边的那个节点,将整个右子树放到该节点的右边。然后再把左子树...原创 2019-10-14 21:53:40 · 301 阅读 · 0 评论 -
leetcode 477
这题技巧题,没做出来。越到正确率低的题,发现自己被大神的解法秀的头晕。这题是给一组数字,求它们两两之间hamming distance之和。当然,萌新做法是遍历每一对数字,求出它们的hamming distance,然后再求和得到结果。coding的时候都是虚的,因为想到了这题怎么可能会让用那么low的方法。最后看了大神的解答后,才恍然大悟。正确的解法应该是针对每一个bit位,统计所有数字在这个b...原创 2018-09-27 09:38:15 · 288 阅读 · 0 评论 -
leetcode 712
这题是个好题目,mark一下。首先我的思路是求这两个字符串的最长公共子序列,然后遍历这些子序列,找到值最小的那个。结果想了一下,最长子序列不唯一,这样回溯特别复杂,这题应该不是这样做(今天太忙,明天要把最长子序列的长度及回溯实现一下)。后来看了答案才知道是用动态规划来做。说实话,动态规划现在对于我而言,还是不太能掌握的东西,因为很多时候想不到如何很好地定义dp数组的含义,还需要多加联系。dp最...原创 2018-09-19 19:59:57 · 466 阅读 · 0 评论 -
leetcode 858
此题是技巧题,挺有意思的。题目主要是说镜子反射的问题,这题花费的比较长的时间。建议可以先手动画一画找找规律,我们可以很容易推导得到从侧面经过上下底面返回到第一个侧面的时候,距离最近点的初始距离是q- p %q,这个可以通过斜率不变以及相似三角形的性质推导得到。知道这一点之后,我们需要考虑的只有方向的问题,我们可以设置两个bool变量,来表示在上下,和在左右,我们可以很容易知道每次碰到上下面的时候,...原创 2018-09-13 21:16:23 · 209 阅读 · 0 评论 -
leetcode 347
这个题目虽然不够新,但是还是需要mark一下,解决了我的一些误区。这题的想法很简单,就是需要统计一下数字出现的频率,然后排个序,输出前K个,就Ok了。但是要求复杂度小于nlgn。想了半天,觉得一定要排序呀,后来看了discuss才发现,自己忘了bucket sort。一个典型的牺牲空间换时间的算法。主要就是列出一个足够长的数组,把数字按照频率放在对应的位置上面。最后再从后向前遍历一遍,就得到结果了...原创 2018-09-17 09:27:08 · 159 阅读 · 0 评论 -
leetcode 889
此题是个好题目。让我想起了当年学数据结构和编译原理时候的前序,后序,中序表达式。该题的思路也比较清楚,首先我想到的是前序第一个数字肯定是根节点,根节点后面跟着的肯定是左子树的值,接着我们在后序里面找到这个左子树的值,该值之前的所有数肯定都属于这个子树。就这样可以将原问题化为更小的子问题。在实现上述思路的时候,又想到对于每个数字,在前序列表中,该数字后面的肯定是它的左子树,在后序列表中该数字前面的肯...原创 2018-09-06 19:25:09 · 403 阅读 · 0 评论 -
leetcode 877
此题虽然题目不好,但是Discuss中的solution非常好。mark,mark。这题我的解法是递归。因为看到了两者都是采用最优的解法。所以很自然地就能够想到问题可以分解为更小的子问题。结果我用递归做,超时了。。。。后来看别人的解法,才想到dp(太久不用dp,都完全忽略了这种解法,自己对dp的掌握也不够熟练)。当然也看到了直接返回True的解法,下面我对这几种方法来分析一下:首先是递归解法,...原创 2018-09-05 09:39:59 · 681 阅读 · 0 评论 -
leetcode 406
这题虽然最后做出来了,但是花费的时间太多。主要的idea还是比较容易得到的。看到这种题,我的第一直觉肯定就是按照某一行或列元素进行排序。排过序之后再在草稿纸上推推,就大概能得到思路。这里我们按照第一个元素进行排序,eg. [[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]排序后得到:[[4,4],[5,0],[5,2],[6,1],[7,0],[7,...原创 2018-09-02 16:09:36 · 1324 阅读 · 0 评论 -
leetcode 894
此题想法比较简单,但是我遇到了一个坑。值得mark。首先介绍思想,这题是给一个N,然后让输出所有的二分树,首先偶数的N是不可能有结果的,试一下就知道,然后对于奇数,就采用递归的思想,将N-1分给左右两边,然后当作子问题去求解。这里因为会有许多重复的计算,所以借鉴记忆化dp的思想,声明一个数组来记录一下每次的树结构,避免重复计算。大坑:一开始我是在循环外面定义root = TreeNode(0)...原创 2018-08-29 15:07:32 · 559 阅读 · 0 评论 -
leetcode 791
此题一种直观的思想是O(mn)的算法,就是遍历S,对于S中的每个值,在T中进行查找,然后提前。通过看他人的答案,发现了O(m+n)的方法,该方法是首先统计T中每个单词出现的频率,然后遍历S,对于S中每个值,在结果中添加该值对应的频率的字符串,最后再把没有出现的值放在后面。mark一下:O(MN):class Solution: def customSortString(self, ...原创 2018-08-31 09:35:19 · 217 阅读 · 0 评论 -
leetcode 797
emmmm这题最后没做出来。一开始是想用bfs来做的,bfs写出来了,发现找路径不会,琢磨一会后,找路径写出来了,发现不像树结构,这里是有可能有两个父节点的。弄了半天,总是不对。后来只好参考别人的答案,发现用dfs更加直观点。附代码 hint:此题做了好长时间,关键是对dfs和bfs不熟悉,好久不用,每次做这种题都不太想做,就想做无脑的题,emmmm后来发现真正有用的就是那些自己不会的...原创 2018-08-27 10:22:34 · 451 阅读 · 0 评论 -
leetcode 169
today, i decide to write blog in english. let's starti think this problem is so easy by using sort or extra space. if you use sorting, you can get the middle number after sorting with O(nlogn). if原创 2018-02-06 11:25:01 · 119 阅读 · 0 评论 -
leetcode238
这题666,mark一下,没做出来,以后接着做。看了别人的解答,基本思想是对于index,index左边的所有数的乘积乘上index右边的所有数的乘积。通过一次循环可以得到,每一位之前的累加乘积(之前好像做过这样的题,就是没想起来,尴尬),从前往后遍历一遍,从后往前遍历一遍,就得到了最上面的方法所需要的条件了。最后遍历一遍,求出所有的数值。好吧,关键就是最上面的想法没有get,原创 2018-02-03 20:55:48 · 326 阅读 · 0 评论