随笔分类 - 数据结构与算法
摘要:动态规划的核心是找到解题路径中的重复子问题,避免重复计算。 找出问题间的递归关系,用问题解决问题需要培养归纳的思维。 问题定义的好坏直接影响到可以定位出的重叠子问题的多少,可以找出的重叠子问题越多,问题定义越好。 下面是两种问题的定义,效率差距非常大。 解法1,超时: public final in
阅读全文
摘要:public List<List<String>> solveNQueens(int n) { //棋盘 char[][] board = new char[n][n]; //结果集合 List<List<String>> reList = new LinkedList<List<String>>(
阅读全文
摘要:缓存分治: public final double largestSumOfAverages(int[] A, int K) { int len = A.length; double re = largest(A, K, 0, len - 1, new double[len][len][K + 1]
阅读全文
摘要:在二维平面上进行回溯搜索: String word; char[][] board; public final boolean exist(char[][] board, String word) { this.word = word; this.board = board; for (int i
阅读全文
摘要:比较常规的解法为回溯解法: List<List<Integer>> reList = new LinkedList<List<Integer>>(); public final List<List<Integer>> subsets1(int[] nums) { reList.add(new Arr
阅读全文
摘要:题目被 leetcode 归类为动态规划,苦思冥想,没有找到合适的问题定义。 决定首先穷举,借以理解解空间的结构。穷举解法: /** * @Author Niuxy * @Date 2020/7/20 11:17 下午 * @Description 穷举 */ String longestStr =
阅读全文
摘要:借助链表实现: class BSTIterator { final List<TreeNode> treeList; int currentPoint; int length; public BSTIterator(TreeNode root) { treeList = new LinkedList
阅读全文
摘要:翻译一下这个题:在固定的集合内寻找符合条件的组合,设组合中相邻的两个元素分别为 pre[],current[] ,则组合需要: 1. 两段视频拼接是没有空隙,也就是 current[0] <= pre[1] 2. 不要重复组合,需要:current[1] > pre[1] 3. 组合要涵盖 0 到
阅读全文
摘要:BFS 解法: private final void addRow(Stack<TreeNode> stack, int v) { while (!stack.empty()) { TreeNode node = stack.pop(); TreeNode newNodeLeft = new Tre
阅读全文
摘要:基于双向数组实现: class MyCircularDeque { class Node { int val; Node pre; Node next; Node(int val) { this.val = val; } } private final int capacity; private f
阅读全文
摘要:首先,既然是缓存,哈希表是必须用到的,保证以 O(1) 时间复杂度进行查询。 另外需要维护元素的使用顺序,不断将近期使用的元素推向前方,并在超出容量时删除末尾元素,这里使用双向链表实现对使用顺序的维护。 class LRUCache { class ListNode { ListNode pre;
阅读全文
摘要:最简单的思路为双递归,内部递归函数用于计算以 node 节点为头元素的路径和, 外部递归函数用于遍历所有节点。 即遍历以每个节点为头元素的所有符合条件的路径: /** * @Author Niuxy * @Date 2020/7/15 11:04 下午 * @Description 双递归 */ p
阅读全文
摘要:public boolean isBalanced(TreeNode root) { if (root == null) { return true; } int diff = getDepth(root.left) - getDepth(root.right); diff = diff > 0 ?
阅读全文
摘要:回溯解法: int an = 0; public final int getMaximumGold(int[][] grid) { for (int i = 0; i < grid.length; i++) { for (int j = 0; j < grid[0].length; j++) { g
阅读全文
摘要:一道中规中矩的 DP 题目,但因为问题空间较大,需要做一些优化。 分治法: int an = 0; public final int longestSubsequence(int[] arr, int difference) { if (arr.length == 0) { return 0; }
阅读全文
摘要:这道题怎么说呢,真的很卧槽。分分钟想把出题人打一顿,题目根本没说明白,字符串中会包含 '0' 。状态转移五分钟,边界处理两小时。 DP 解法: public final int numDecodings(String s) { if (s == null || s.length() == 0 ||
阅读全文
摘要:DFS 解法,通过回溯一个 StringBuilder 记录下所有路径代表的数字并求和: StringBuilder sb = new StringBuilder(); int re = 0; public int sumNumbers(TreeNode root) { if (root == nu
阅读全文
摘要:双指针解法1: public final boolean isPalindrome(String s) { int length = s.length(); int leftPoint = 0; int rightPoint = length - 1; s = s.replaceAll("[\\pP
阅读全文
摘要:回溯算法,加缓存过滤已走过的无效路径: public final List<List<Integer>> pathWithObstacles(int[][] obstacleGrid) { Stack<List<Integer>> stack = new Stack<List<Integer>>()
阅读全文
摘要:一个变种的斐波那契数列,DP 没跑了,问题在于如何处理外观的逻辑。用栈存储当前计数的元素,递归表示: public final String countAndSay0(int n) { String[] cache = new String[n + 1]; return countAndSay0(n
阅读全文