摘要:
暴力解法: public final int maximumSum1(int[] arr) { int max = Integer.MIN_VALUE; for (int i = 0; i < arr.length; i++) { for (int j = i; j < arr.length; j+ 阅读全文
摘要:
分治解法: public final int lengthOfLIS(int[] nums) { int[] cache = new int[nums.length]; int re = 0; for (int i = 0; i < nums.length; i++) { re = Math.max 阅读全文
摘要:
定义 G(b,e) 为 b 到 e 之间的元素可以组成的所有二叉搜索树。 在 b ,e 之间选出一个元素作为根节点, 则以该元素为根的所有可能的二叉搜索树为 G(b,i-1) ,G(i+1,e) 的笛卡尔积。 寻找顶层问题本身的递归结构,走的弯路最少。 public final List<TreeN 阅读全文
摘要:
public final boolean isSubPath(ListNode head, TreeNode root) { if (root == null) { return false; } Stack<TreeNode> stack = new Stack<TreeNode>(); stac 阅读全文
摘要:
两个关键点,一是在滑动窗口内查找元素, 二是在区间内查找元素。 滑动窗口内查找元素可以使用哈希表维护滑动窗口,保持 O(1) 的查询效率。 区间内查找元素可以使用有序的数据结构,查找出与元素相邻的前后两个元素,判断他们是否在区间内。 /** * @Author Niuxy * @Date 2020/ 阅读全文
摘要:
巧用数据结构,空间换时间。 /** * @Author Niuxy * @Date 2020/7/4 11:17 下午 * @Description 朴素解法 O(N * min(K,nums.length-N)) */ public boolean containsNearbyDuplicate0 阅读全文
摘要:
回溯解法: private List<List<Integer>> anList = new LinkedList<List<Integer>>(); public final List<List<Integer>> combinationSum3(int k, int n) { combinati 阅读全文
摘要:
直接挑战 O(1) 空间复杂度解法,双指针尾插法: /** * @Author Niuxy * @Date 2020/7/2 9:16 下午 * @Description 双指针尾插法 */ public void merge(int[] nums1, int m, int[] nums2, int 阅读全文
摘要:
暴力求解时找到正确的遍历解空间的方式很重要。有的遍历方式本身具有递归结构,同时存在重复子问题,可以方便的做优化。 寻找函数的定义取决于我们看问题的角度,这与生活中解决问题的思路是相通的。 在剖析问题时,应该从多种角度去观察问题: 从整体到局部、局部到整体的视角转化;关键逻辑的取逆,比如极大化极小、极 阅读全文
摘要:
记忆化递归解法: //结果计数 int an = 0; /** * @Author Niuxy * @Date 2020/6/30 10:38 下午 * @Description 外部循环,以每个元素开头的子串 * 内部循环,以每个元素结尾的子串 * 就可以遍历到所有长度大于 1 的可能的子串 */ 阅读全文