LeetCode问题选

leet141. Linked List Cycle

检测一个链表中是否有环。方法是使用一个快指针(一次走两步,兔子),和一个慢指针(一次走一步,乌龟),如果龟兔相遇了,就说明有环。在其他题目中也可以使用快指针,比如找出一个链表的中点。题目109. Convert Sorted List to Binary Search Tree就用到了这个技巧。快指针可以检测出环,但是如何找出环的起点呢(142. Linked List Cycle II)?当龟和兔相遇时,将龟放回起点,并且将兔子的速度降为1,可以通过数学计算证明,他们再次相遇的位置就是环的起点。这就是Floyd's Tortoise and Hare算法。19. Remove Nth Node From End of List,删除链表中倒数第N个节点,也是使用两个指针,先让第一个指针移动N步,然后两个指针同步移动,这样第一个指针到达终点时,第二个指针就是要删除的位置。

leet98. Validate Binary Search Tree

题目链接

题目描述:检验一棵二叉树是不是二叉搜索树。解题思路:对于二叉搜索树,中序遍历的顺序就是元素的自然排序。本题与题目94. Binary Tree Inorder Traversal和题目230. Kth Smallest Element in a BST都可以通过中序遍历来解。其中题目94要求使用非递归的方式。非递归遍历需要使用一个栈,一直往左下走,沿途节点全部入栈,直到最左下角,然后出栈。参考解答 给出了全部三道题的代码。题目99. Recover Binary Search Tree,BST树中某两个节点的数值被交换了,找出这两个节点,要求只能用O(1)的空间,同样可以用中序遍历的方法去解,关键技巧在于如何区分第一个节点和第二个节点,因为树中的多个节点可能都违反了BST的性质。参考代码

leet174. Dungeon Game

题目链接

解题思路:动态规划。但是从左上角开始计算是不可行的,从右下角开始却是可以的,每个格子填写从该格子出发需要的生命点数,时间复杂度O(m*n)。参考解答

leet164. Maximum Gap

题目链接

题目描述:一个无序数组,求排序后相邻元素之间gap的最大值,要求时间和空间复杂度都是O(n)。解题思路:借鉴桶排序的思想,找到最小和最大值minVal,maxVal,让后将整个区间分成n-1段,记录每段的最大值和最小值。那么最大的gap至少等于区间的长度,然后只要考察区间之间的gap即可。效率O(n)。参考解答

leet149. Max Points on a Line

题目链接

解题思路:对于每个点,记录该点与其他的点形成的直线的斜率,按斜率分组。效率O(n*n)。参考解答

leet146. LRU Cache

题目链接

解题思路:一个hashmap和一个双向链表。刚访问过的元素从链表中取出,加到链表尾部。注意hashmap中存的value是node的地址,这样才可以快速在链表中取出该node,get和set效率都是O(1)。参考解答

leet128. Longest Consecutive Sequence

题目链接

解题思路:题目和上面的164很像,但是解法不同。一种思路是通过两个hashmap,记录下每个区间的begin和end,一个hashmap以begin为key,一个以end为key。遍历数组的过程中不断将区间合并。注意首先需要将数组去重,否则结果是错的。另一种更简单的方案是,对于每个a[i],检查a[i]+1, a[i]+2, ...是否在数组中,直到a[i]+k不在其中为止;以及a[i]-1, a[i]-2, ...。并将检查过的元素删掉。这样每个元素将只会访问一次。效率O(n)。参考解答

leet87. Scramble String

题目链接

解题思路:仔细思考后会发现,需要比较每个s1[i : i+k]和s2[j : j+k],故需要动态规划。dp[k][i][j]记录s1[i : i+k]是否可以变成s2[j : j+k]。对于长度为k的字符串,需要考虑从中间任一位置截断的可能,故时间复杂度O(n**4)。

leet85. Maximal Rectangle

题目链接

解题思路:需要用到题目84 Largest Rectangle in Histogram。依次以每一行作为bottom,考虑bottom上值为1的那些列,这样就变成了一个Histogram。Histogram的效率为O(n),故本题效率为O(m*n)。

leet84. Largest Rectangle in Histogram

题目链接

解题思路:对于每一列,记录在这一列的高度上向左最多延伸到哪里和像右延伸到哪里。百度“单调队列”,效率O(n)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值