随笔分类 -  数据结构与算法

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