09 2018 档案

摘要:10. Regular Expression Matching 经典DP题目,比较复杂,需要多复习。 dp[i][j] 表示 s 下标0~i,p 下标0~j 是否能够匹配 dp[i-1][j-1] s[i]==p[j] || p[j]=='.' dp[i][j] = dp[i][j-2] p[j]= 阅读全文
posted @ 2018-09-27 03:12 約束の空 阅读(125) 评论(0) 推荐(0)
摘要:和top k element一样的题目。创建大顶堆,pop前k个就是所求。nlogn 也可以创建一个大小为k的小顶堆,这样最后留下的就是最大的k个元素。小顶堆和大顶堆正好相反,在cmp函数写的时候,除了a.second>b.second, if (a.second==b.second) return 阅读全文
posted @ 2018-09-14 11:55 約束の空 阅读(147) 评论(0) 推荐(0)
摘要:模拟时间流逝,如果当前时间是start,++room;如果是end,呢么--room。但是一个for循环从时间起点到终点太麻烦,可以用一个map来记录,(map是有序的)。 时间复杂度O(nlogn),每次插入map都要logn。 方法二:Sort+Priority_queue 也可以记录最早的结束 阅读全文
posted @ 2018-09-14 10:58 約束の空 阅读(303) 评论(0) 推荐(0)
摘要:后序遍历,把每个节点的后序遍历用字符串保存下来。 时间复杂度,T(n)=2T(n/2)+n (字符串处理) = O(nlogn),最坏 O(n^2)。 空间复杂度,每个节点都要字符串来存,O(n^2)。 阅读全文
posted @ 2018-09-14 09:07 約束の空 阅读(230) 评论(0) 推荐(0)
摘要:用backtracing做超时了,代码如下: 本题可以用优先队列+Greedy做。 首先对计算每个字母出现个数,根据个数建立优先队列,个数多的在前。每次选取队列前两个字母,这样一定不会有重复字母在一块。建立优先队列的时候,如果某个字母的出现次数比 (s.size()+1)/2 还要大,说明不行,返回 阅读全文
posted @ 2018-09-14 04:31 約束の空 阅读(287) 评论(0) 推荐(0)
摘要:题目要求O(log(m+n)),很自然想到二分。但是怎么二分缩小搜索区域比较tricky。找中位数,可以看成找第k个数的问题,比较两个数组第k/2个元素(奇数偶数都可),小的那个数组的前面元素都可以丢掉(不可能是第k大的元素)。 本题的corner case比较多,如k==1,len=0。而且有奇数 阅读全文
posted @ 2018-09-12 07:18 約束の空 阅读(120) 评论(0) 推荐(0)
摘要:Sliding Window 的问题,初始想法是优先队列,保存下标,如果移除的下标正好是优先队列的top,pop()。时间复杂度应该是O(nlogn)。 题目要求用O(n),可以利用deque,队首为最大元素,如果移除的元素是最大元素,pop_front()。对于新的待加元素,pop_back() 阅读全文
posted @ 2018-09-11 11:51 約束の空 阅读(93) 评论(0) 推荐(0)
摘要:如果把数组换成字符串,这道题就是 Longest Common Substring 的问题。当然,这个和 最长子序列 Longest Common Subsequence 是不一样的。 类似求极值的题,都要用DP想一想。本题就可以用DP来做。 dp[i][j] 表示a数组0~i 和 b数组前0~j, 阅读全文
posted @ 2018-09-10 23:21 約束の空 阅读(147) 评论(0) 推荐(0)
摘要:用两个变量指向red和blue的边界,i遍历数组。 如果nums[i]=0,和nums[red]交换,nums[red]为1(因为i遍历nums[red],是0到前面去了,是2到后面去了),++i。 如果nums[i]=2,和nums[blue]交换,这里nums[blue]可能为0或1,因此交换以 阅读全文
posted @ 2018-09-09 22:53 約束の空 阅读(99) 评论(0) 推荐(0)
摘要:找连续subarray的题,都考虑一下滑动窗口。 形如 sum/product < k 的题,维护一个 <k 的滑动串口,每次 ++end 后,要改变start使得区间能够保持原有性质。 如果是 > k 的题,同样也是维护一个 <=k 的滑动窗口,类似单调栈的处理方法,++end之后,start对应 阅读全文
posted @ 2018-09-07 13:05 約束の空 阅读(248) 评论(0) 推荐(0)
摘要:76. Minimum Window Substring 典型Sliding Window的问题,维护一个区间,当区间满足要求则进行比较选择较小的字串,重新修改start位置。 思路虽然不难,但是如何判断当前区间是否包含所有t中的字符是一个难点(t中字符有重复)。可以通过一个hashtable,记录 阅读全文
posted @ 2018-09-07 12:06 約束の空 阅读(156) 评论(0) 推荐(0)
摘要:325. Maximum Size Subarray Sum Equals k 类似sum的题都可以想一想可不可以把sum依次求出来,然后 [i+1,j] 的sum 直接用 sum[j]-sum[i]来求。 由于这道题有负数存在,没办法用sliding window来做,只能另辟蹊径。 用一个has 阅读全文
posted @ 2018-09-07 09:19 約束の空 阅读(193) 评论(0) 推荐(0)
摘要:209. Minimum Size Subarray Sum 方法一:Sliding Window 滑动窗口问题,维护一个sum<s的窗口(类似单调栈),遇到sum>=s的情况,就处理并++start。时间复杂度O(n)。 方法二:二分 由于从0~i的sum是单调的,可以用二分找。n个元素,每个元素 阅读全文
posted @ 2018-09-07 08:46 約束の空 阅读(130) 评论(0) 推荐(0)
摘要:基础backtracing题,先排序一下,每次传一个参数表示开始的下标。注意dfs的时候,是i,不是i+1,因为同样的元素可以使用很多次。 40. Combination Sum II 有重复元素的情况。和Permutation II处理方法类似,如果 i>start && candidates[i 阅读全文
posted @ 2018-09-07 03:47 約束の空 阅读(104) 评论(0) 推荐(0)
摘要:一开始用bfs做,memory不够,估计用dfs可以做。既然可以dfs来做,而且不需要保存路径等信息,肯定可以用dp来做。 方法一:DP 时间复杂度O(n^2) 方法二:Greedy 久违的贪心问题,其实我们只关心最大能跳到的距离, 因此可以用贪心来做。 时间复杂度O(n) 45. Jump Gam 阅读全文
posted @ 2018-09-06 04:39 約束の空 阅读(103) 评论(0) 推荐(0)
摘要:必须利用原数组进行操作,第一想到的就是利用元素的对应下标,把nums[i]-1下标的元素*-1来做。但是由于0存在,所以不行。 可以利用while循环,把当前位置符合要求的元素swap到正确的位置,最后只要遍历nums,如果 i 下标的数不为 i+1,说明 i+1就是答案。如果没有这样的数,那么答案 阅读全文
posted @ 2018-09-06 03:47 約束の空 阅读(95) 评论(0) 推荐(0)
摘要:暴力会超时,利用二分优化。 阅读全文
posted @ 2018-09-05 23:14 約束の空 阅读(86) 评论(0) 推荐(0)
摘要:这道题的本质是寻找 数组里比某个元素大的第一个元素。 可以用单调栈来做,维护一个单减的栈,遇到大的元素,出栈知道栈顶元素大于当前元素。该过程中出栈的元素的next greater element就是当前元素。 II 循环用 i%n 可以解决,但是这道题相比上一题有了重复的元素,所以stack里存下标 阅读全文
posted @ 2018-09-05 11:39 約束の空 阅读(106) 评论(0) 推荐(0)
摘要:多了重复的元素,可以先通过排序,如果当前元素和之前元素相同,且之前的元素没有被visit过,说明前一个元素已经访问过并重新置为没访问过,所以这种情况需要continue。 也可以用之前I的第二种方法,交换,这样就不用排序了,但是为了防止重复的答案,所以需要set 注意 dfs(start+1) , 阅读全文
posted @ 2018-09-05 10:35 約束の空 阅读(119) 评论(0) 推荐(0)
摘要:基础backtracing的题。 之前的方法需要一个used来判断元素是否被使用过。 而下面这种方法思路很不错,每次交换数组里两个元素,当前面都枚举完毕后,从[start,...,end]依次交换。 阅读全文
posted @ 2018-09-05 05:25 約束の空 阅读(107) 评论(0) 推荐(0)
摘要:实质就是求每个节点的最大深度。用一个hash表记录,最后输出。 其实可以不用hash表,每次深度比vector.size()大的时候新建一个vector,这样节省了空间。 类似的方法在别的题里也有应用。 时间复杂度 O(n) 空间复杂度 O(n) 阅读全文
posted @ 2018-09-04 11:56 約束の空 阅读(119) 评论(0) 推荐(0)
摘要:BFS的题目,一开始做的时候,我是判断出栈元素和数组里的元素是否距离为1,超时。思考了一下觉得是判断是否距离为1处,所有换过一个字母的字符串都要和每个wordList里元素比较,太耗时了。 所以直接建立一个set,所有换过一个字母的字符串直接在set里找,找到了就直接erase,方便不少。 Word 阅读全文
posted @ 2018-09-04 01:38 約束の空 阅读(214) 评论(0) 推荐(0)
摘要:找中序遍历的后一个节点,那就中序遍历到当前节点后再往后一个,可以用递归,也可以非递归,完全没有用到BST的性质。 也可以充分利用BST的性质,如果p比当前节点小,说明在左子树,res=root;否则去右子树搜索。 用递归写 引申一下,如果求前面一个节点,也是一样做,只不过left right反一反。 阅读全文
posted @ 2018-09-01 01:52 約束の空 阅读(330) 评论(0) 推荐(0)