摘要:
LeetCode 216.组合总和III 分析1.0 回溯问题 组合总和sum == n 时以及path中元素个数 == k 时,res.add(new path) 返回后递归删除掉当前值 class Solution { public List<List<Integer>> res = new A 阅读全文
摘要:
基础知识 回溯法解决的问题都可以抽象为树形结构,集合的大小就构成了树的宽度,递归的深度构成的树的深度 void backtracking(参数) { if (终止条件) { 存放结果; return; } for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) { 处理节点; back 阅读全文
摘要:
LeetCode 669. 修剪二叉搜索树 分析1.0 递归遍历树时删除符合条件(不在区间中)的节点-如何遍历如何删除 如果当前节点大于范围,递归左树,反之右树 当前节点不在范围内,删除它,把它的子树返回给上一层 class Solution { public TreeNode trimBST(Tr 阅读全文
摘要:
LeetCode 235. 二叉搜索树的最近公共祖先 分析1.0 二叉搜索树根节点元素值大小介于子树之间,所以只要找到第一个介于他俩之间的节点就行 class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNod 阅读全文
摘要:
LeetCode 530.二叉搜索树的最小绝对差 分析1.0 二叉搜索树,中序遍历形成一个升序数组,节点差最小值一定在中序遍历两个相邻节点产生 ✡✡✡ 即 双指针思想在树遍历中的应用 class Solution { TreeNode pre;// 记录上一个遍历的结点 int result = I 阅读全文
摘要:
LeetCode 654.最大二叉树 分析1.0 if(start == end) return节点索引 locateMaxNode(arr,start,end) new root = 最大索引对应节点 max.right = 最大节点右侧子数组的最大值 要保证能够递归 max.left = 最大节 阅读全文
摘要:
LeetCode 513.找树左下角的值 分析1.0 二叉树的 最底层 最左边 节点的值,层序遍历获取最后一层首个节点值,记录每一层的首个节点,当没有下一层时,返回这个节点 class Solution { ArrayDeque<TreeNode> queue = new ArrayDeque(); 阅读全文
摘要:
LeetCode 110.平衡二叉树 分析1.0 求左子树高度和右子树高度,若高度差>1,则返回false,所以我递归了两遍 class Solution { public boolean isBalanced(TreeNode root) { if(root == null){ return tr 阅读全文
摘要:
基础知识 二叉树的多种遍历方式,每种遍历方式各有其特点 LeetCode 104.二叉树的最大深度 分析1.0 往下遍历深度++,往上回溯深度-- class Solution { int deep = 0, max = 0; public int maxDepth(TreeNode root) { 阅读全文
摘要:
层序遍历 /** * 二叉树的层序遍历 */ class QueueTraverse { /** * 存放一层一层的数据 */ public List<List<Integer>> resList = new ArrayList<>(); public List<List<Integer>> lev 阅读全文
摘要:
基础知识 二叉树基础知识 二叉树多考察完全二叉树、满二叉树,可以分为链式存储和数组存储,父子兄弟访问方式也有所不同,遍历也分为了前中后序遍历和层次遍历 Java定义 public class TreeNode { int val; TreeNode left; TreeNode right; Tre 阅读全文
摘要:
基础知识 ArrayDeque deque = new ArrayDeque(); /* offerFirst(E e) 在数组前面添加元素,并返回是否添加成功 offerLast(E e) 在数组后天添加元素,并返回是否添加成功 pollFirst()删除第一个元素,并返回删除元素的值,如果元素为 阅读全文
摘要:
基础知识 String StringBuilder 操作 public class StringOperation { int startIndex; int endIndex; { //初始容量为16个字符 主要做增删查改 索引包头不包尾 StringBuilder sb = new String 阅读全文
摘要:
基础知识 使用ArrayDeque 实现栈和队列 stack push pop peek isEmpty() size() queue offer poll peek isEmpty() size() LeetCode 232.用栈实现队列 分析1.0 队列先进先出,栈先进后出,每次获得栈中的最后一 阅读全文
摘要:
LeetCode 28. 实现 strStr() 牢记一点:next[i] 元素表示【0,i】子串的最长相等前后缀个数,也是模式串与主串匹配不相等时模式串的下一个比较索引 分析1.0 前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串。 后缀是指不包含第一个字符的所有以最后一个字符结尾的连续 阅读全文
摘要:
基础知识 // String -> char[] char[] string=s.toCharArray(); // char[] -> String String.valueOf(string) 注意replace replaceAll区别,都是全局匹配替换,不过replaceAll是正则匹配 L 阅读全文
摘要:
LeetCode 454.四数相加II 分析1.0 这个最直接暴力法,不过过于暴力了,害怕.jpg 失误 读题理解失误:题目要求的是四元组的个数,读完题到我这里成了输出四元组,悲哉 分析2.0 记录有多少个可能为0的四元组就行了,两层for循环每次的下标索引都是不一样的,于是遍历前两组将元素和加入M 阅读全文
摘要:
基础知识 哈希 常见的结构(不要忘记数组) 数组 set (集合) map(映射) 注意 哈希冲突 哈希函数 LeetCode 242 分析1.0 HashMap<Character, Integer> 记录字符元素及其个数,再以字符序列对key进行排序,比较两个Map是否一致或者是遍历Map1的时 阅读全文
摘要:
基础知识 记录一下栈实现及操作 public class ArrayDequeStack { public void main() { ArrayDeque stack = new ArrayDeque(); // 大小 System.out.println(stack.size()); // 依次 阅读全文
摘要:
基础知识 数据结构初始化 // 链表节点定义 public class ListNode { // 结点的值 int val; // 下一个结点 ListNode next; // 节点的构造函数(无参) public ListNode() { } // 节点的构造函数(有一个参数) public 阅读全文
摘要:
欢迎关注个人公众号:爱喝可可牛奶 LeetCode算法训练-动态规划 理论知识 动态规划当前状态是由前一个状态推导出来的,而贪心没有状态的转移 动态规划需要借助dp数组,可能是一维也可能是二维的 首先要明确dp数组是用来干什么的,下标对应什么 状态如何转移 ? 也就是理清递推公式 dp数组如何初始化 阅读全文
摘要:
欢迎关注个人公众号:爱喝可可牛奶 LeetCode算法训练-贪心算法 455.分发饼干 376. 摆动序列 53. 最大子序和 前置知识 贪心算法核心是找局部最优解,通过局部最优推导出全局最优 LeetCode 455. 分发饼干 分析 要求:把饼干分给孩子,并返回分了多少个孩子 局部最优:小饼干分 阅读全文
摘要:
欢迎关注个人公众号:爱喝可可牛奶 LeetCode算法训练-回溯总结 适用问题 组合问题:N个数里面按一定规则找出k个数的集合 排列问题:N个数按一定规则全排列,有几种排列方式 切割问题:一个字符串按一定规则有几种切割方式 子集问题:一个N个数的集合里有多少符合条件的子集 棋盘问题:N皇后,解数独等 阅读全文
摘要:
欢迎关注个人公众号:爱喝可可牛奶 LeetCode算法训练-回溯 491.递增子序列 46.全排列 47.全排列 II LeetCode 491. 递增子序列 分析 找出并返回所有数组中不同的递增子序列 绝对不能先升序 绝对不能先升序 绝对不能先升序 这样会改变原有数组的结构 子序列中元素在数组中不 阅读全文
摘要:
欢迎关注个人公众号:爱喝可可牛奶 LeetCode算法训练 93.复原IP地址 78.子集 90.子集II LeetCode 93. 复原 IP 地址 分析 字符串全部由数字组成,ipv4每一段数字不能有前导0,且大小∈[0,255] 等价于将字符串进行分割,并判断分割后的数是否满足条件 插入一个点 阅读全文
摘要:
欢迎关注个人公众号:爱喝可可牛奶 LeetCode 39. 组合总和 40.组合总和II 131.分割回文串 LeetCode 39. 组合总和 分析 回溯可看成对二叉树节点进行组合枚举,分为横向和纵向 每次往sum添加新元素时,必须明确从can哪个位置开始,定义变量pos 返回条件 sum == 阅读全文