随笔分类 - 数据结构与算法
摘要:寻找问题的递归结构有时很简单,有时又很难。以本题来说,绝对不属于简单的行列。 问题的规模不是由单一的字符串长度决定,而是由两个字符串的长度共同决定。那么子问题的分割将由按长度的顺延变为两个字符串所有可能长度的笛卡尔积。 子问题的数量和组合多到让人很难理清问题与子问题之间的关系。 这种情况下,可以将目
阅读全文
摘要:JAVA 递归描述: int re = 0; public final int longestMountain(int[] arr) { if (arr.length < 3) return 0; longest(arr, 1, 0, 0); return re == 0 ? re : re + 1
阅读全文
摘要:JAVA: public final boolean escapeGhosts(int[][] ghosts, int[] target) { int shortest = shortest(new int[]{0, 0}, target); for (int[] ghost : ghosts) {
阅读全文
摘要:JAVA 双向链表实现: class MyLinkedList { private Node begin; private Node end; private int len; private class Node { int val; Node next; Node pre; Node(int v
阅读全文
摘要:JAVA 暴力解法: public final int networkDelayTime(int[][] times, int n, int k) { Map<Integer, List<Integer[]>> map = new HashMap<Integer, List<Integer[]>>(
阅读全文
摘要:字典树实现,JAVA: class MagicDictionary { Node root; /** * Initialize your data structure here. */ public MagicDictionary() { } public void buildDict(String
阅读全文
摘要:提前验证抽象的正确性,尤其是边界问题在抽象中是否可以被很好的解决。然后以抽象的角度去考虑问题,简化问题。 比如双指针,提前验证可以使用双指针方法后,只需要考虑区间何时退出以及退出时的逻辑即可。 双指针原地压缩算法 JAVA: public final int compress(char[] char
阅读全文
摘要:暴力解法很容易,JAVA 暴力解法: public final ListNode mergeKLists(ListNode[] lists) { ListNode head = new ListNode(0); ListNode node = head; while (true) { int min
阅读全文
摘要:多种解题方式,位计数感觉最精彩。 JAVA Hash表: public final int findDuplicate(int[] nums) { Set<Integer> set = new HashSet<Integer>(); for (int i = 0; i < nums.length;
阅读全文
摘要:相比起暴力解法,前缀树可以实现空间换时间。将多个 small 构建为一棵前缀树,在树上遍历一次 big 。可替代用每个 small 与 big 比对。 JAVA: private class Trie { boolean isEnd; Trie[] childs; int num; int flag
阅读全文
摘要:JAVA 暴力解法,这一步是比较难的,该思路我称之为左右逢源。视角放在局部,每个元素对应的结果与左右所有元素相关: public final int trap(int[] height) { int re = 0, len = height.length; for (int i = 1; i < l
阅读全文
摘要:JAVA: class WordDictionary { private Node head; /** * Initialize your data structure here. */ public WordDictionary() { this.head = new Node(null); }
阅读全文
摘要:JAVA 实现: class Trie { private Node head; /** * Initialize your data structure here. */ public Trie() { this.head = new Node(); } /** * Inserts a word
阅读全文
摘要:JAVA: public List<List<String>> suggestedProducts(String[] products, String searchWord) { Node head = initTree(products); List<List<String>> reList =
阅读全文
摘要:括号先后成对出现,适合使用栈结构进行处理。 JAVA : public final String minRemoveToMakeValid(String s) { if (s == null || s.length() == 0) return ""; StringBuilder sb = new
阅读全文
摘要:动态规划,递归表示: public final int maxTurbulenceSize(int[] A) { Map<Long, Integer> cache = new HashMap<Long, Integer>(); int an = 0; for (int i = 0; i < A.le
阅读全文
摘要:JAVA 实现,基于红黑树: class TimeMap { Map<String, TreeMap<Integer, String>> map = new HashMap<String, TreeMap<Integer, String>>(); /** * Initialize your data
阅读全文
摘要:通过 ASC 码计数进行子集判断,JAVA: public final List<String> wordSubsets(String[] A, String[] B) { List<String> reList = new LinkedList<String>(); int[] bChars =
阅读全文
摘要:JAVA: public final TreeNode pruneTree(TreeNode root) { if(!hasOne(root)) return null; return root; } private final boolean hasOne(TreeNode node) { if
阅读全文
摘要:所求子数组是连续的子数组,因此想到求取所有可能连续子数组的和。 顺序的求取连续子数组的和具有单调性,因此可以考虑通过滑动窗口来避免重复计算。 public final int minSumOfLengths(int[] arr, int target) { int startPoint = 0, e
阅读全文