摘要: 方法一:Backtracing+Memoization 遇到在wordlist里的单词就继续深搜,memo[i] 用来保存下标i开始到结束的字符串是否能拆分,如果之前保存过,就直接返回,不用重复计算。 用start记录开始的下标,这样就不用传字符串作为参数了,当然用字符串也可以。 如果不用memor 阅读全文
posted @ 2018-07-29 14:57 約束の空 阅读(219) 评论(0) 推荐(0)
摘要: 归并排序的应用。本题将一个链表分为两个有个技巧,就是快慢两个指针,需要注意的是如果一开始 slow=fast=head 来做,后面是 fast=slow->next; slow->next=NULL 的话在两个元素的时候会死循环,因此要么改前面要么改后面。 阅读全文
posted @ 2018-07-29 00:06 約束の空 阅读(104) 评论(0) 推荐(0)
摘要: 经典问题,可以用迭代或是递归来做。迭代也有多种思路,一定要注意各种边界条件。 解法一:直接反转,顾名思义,要记录前面的结点信息,才能反转。能背下来最好。 解法二:把后面的结点依次放到最前面。first指针始终指向初始第一个节点,后面的节点依次挪到最前面。 解法三:递归。可以画图帮助思考,尤其是 he 阅读全文
posted @ 2018-07-26 15:48 約束の空 阅读(133) 评论(0) 推荐(0)
摘要: 解法一:Priority Queue 优先队列实际是对每次对list头结点依次比较排序的一种优化。插入和删除时间复杂度都为O(logk)。一共n个数的话总共是O(nlogk)。 复习一下优先队列的写法。 解法二:Divide and Conquer 阅读全文
posted @ 2018-07-25 23:30 約束の空 阅读(86) 评论(0) 推荐(0)
摘要: 解法一:Monotone Stack 用栈来解决本问题是一种很巧妙的解法,主要运用单调栈。由于面积受制于高度较低的矩形,因此由高至低来处理(最高的宽度为1,其相邻的次高的宽度可以用到最高的,为2,以此类推)。所以本题采用递增的栈,遇到小的元素就pop直至栈顶元素<=当前元素,对于pop出来的元素(一 阅读全文
posted @ 2018-07-22 21:12 約束の空 阅读(143) 评论(0) 推荐(0)
摘要: Recursive 递归处理字符串的题,思路很简单,如果遇到数字,把数字找出来,后面必然是'[',然后 res += decodeString(括号里的内容)。 但是括号内的内容很难直接找到,如果用 while(s[i]!=']') 来找,一旦遇到括号嵌套就会出错。因此,可以把括号的处理放入递归内做 阅读全文
posted @ 2018-07-19 15:35 約束の空 阅读(124) 评论(0) 推荐(0)
摘要: 这两道题很有意思,由于元素为1~n,因此每个元素的值-1(映射到0~n-1)就可以直接当做下标。这样将 nums 中对应下标的元素 *-1 以i表示 index+1 这个元素出现过了,能节省存储的空间。 448. Find All Numbers Disappeared in an Array 44 阅读全文
posted @ 2018-07-18 14:56 約束の空 阅读(98) 评论(0) 推荐(0)
摘要: 本题是 找最大top k 的类似问题,而求解最大top k的解法很经典。 将前k个元素建立一个大小为k的小顶部堆,直接建堆时间 O(k)。如果顺序加入到堆中则需要 k*O(logk)。 对于剩下的 n-k 个元素,如果元素小于堆顶元素,不用管;如果大于,替换掉堆顶元素,并重新维护最小堆的性质。代码实 阅读全文
posted @ 2018-07-17 19:17 約束の空 阅读(150) 评论(0) 推荐(0)
摘要: C++中优先队列priority_queue实现的是heap的功能,默认是大顶堆。 如果需要自定义排序,需要注意,优先队列中小于和大于都是和正常思考相反的。 阅读全文
posted @ 2018-07-17 17:53 約束の空 阅读(239) 评论(0) 推荐(0)
摘要: 5. Longest Palindromic Substring 暴力的话需要枚举开始下标i,结束下标j,并判断该字串是否为回文,需要O(n^3)时间。很明显,通过暴力并判断字串是否为回文效率很低,其并没有考虑到回文的性质。 方法一:DP bool dp[i][j] 表示下标 i~j 的字串是否为回 阅读全文
posted @ 2018-07-16 20:46 約束の空 阅读(143) 评论(0) 推荐(0)