LeetCode刷题笔记

目的

最起码知道leetcode是啥。督促自己不停刷题。

方法

举例子。
善用已有的方法。比如递归、动态规划、分治法等。

  • Two Sum
    数组。
    要将复杂度控制在O(n)。
    数a已知,则target-a的复杂度要是O(1),则只能考虑hashmap。

  • L2 Add Two Numbers
    链表。
    链表1和2不一定等长。此时将代码兼容成一段。
    考虑最高位进位问题。

  • L3 Longest Substring Without Repeating CharactersLongest Substring Without Repeating Characters
    字符串。
    滑动窗口,可以理解为左右指针。比如abcb,当右指针第2次遇到b时,此时左指针滑动到第一次b(因此需要hashmap记录上一次字符出现的位置)的后一个位置。
    因此逻辑为:右指针字符在hashmap中么?若不在,直接加入窗口。若在,分情况1,在窗口内,则左指针滑到hashmap后一个位置。情况2,不在窗口内,直接加入窗口。

  • L91 Decode Ways
    动态规划。
    以1212举例子可以发现,1212可以看作是121 和 2,12和12方法之和。
    即dp[i] = dp[i-1] + dp[i-2]。
    考虑边界条件。若为1220,则是另一种规律。

  • L92 Reverse Linked List II
    链表。
    自己手画一下流程。标准答案不太容易看懂。
    思路就是把左右边界中间的链表按常规逆置。然后处理边界节点的指向问题。

  • L94 Binary Tree Inorder Traversal
    二叉树中序遍历。
    知道二叉树存在 前序中序后序层序遍历,每种又分为递归/非递归(栈)/Morris实现。

  • L95 Unique Binary Search Trees II
    递归。
    标准答案中的i代表i作为根节点。

  • L96 Unique Binary Search Trees
    动态规划。
    若共i个节点,假设左子树有j个节点,则右子树有i-j-1个节点,则dp[i] += dp[j] * dp[i-j-1]。即此时可能性总数为左子树可能性 乘以 右子树可能性。

  • L98 Validate Binary Search Tree
    利用左<跟节点<右节点的特性。

  • L100 Same Tree
    考虑全面边界条件。比如左右树不等长

你可能感兴趣的:(软件工程基础)