
数据结构与算法
记录刷leetcode与剑指offer遇到的题目以及各种解法,输出知识达到理解最大化,同时可以帮助到有需要的人
以后再换个名字
砥砺前行,无问西东
展开
-
Leetcode_#20_有效的括号
原题:#20_有效的括号public boolean isValid (String s) { Stack<Character> stack = new Stack<>(); for (String c : s.toCharArray()) { if (c == '(' || c == '{' || c == '[') { ...原创 2020-05-07 08:47:54 · 189 阅读 · 0 评论 -
Leetcode_#155_最小栈
原题:#155_最小栈使用两个栈:一个是数据栈,全部数都可以进入一个是最小值栈,每输入一个数时,就与当前的最小值比较若大于当前最小值,则再放入一个当前最小值到最小值栈出栈时,数据栈与最小值栈同步出栈为什么要重复放入最小值?最小值栈可以理解为当前时刻数据栈对应的最小值class MinStack { private Stack<Integer&...原创 2020-05-07 08:46:55 · 191 阅读 · 0 评论 -
Leetcode_#255_用队列实现栈
原题:#255_用队列实现栈队列入队时会在对尾。让每一次入队的元素都在队首即可做到后进先出每一次入队时,都把队列原有的元素出队,并再次入队class MyStack { private Queue<Integer> queue; public MyStack() { queue = new LinkedList<>();...原创 2020-05-07 08:45:15 · 161 阅读 · 0 评论 -
Leetcode_#232_用栈实现队列
原题:#232_用栈实现队列栈:先进后出队列:先进先出使用两个栈A,B。进栈时进入A,出栈时先从A出,进入B,再从B出。这时就可以实现先进先出了class MyQueue { private Stack<Integer> in = new Stack<>(); private Stack<Integer> out = new St...原创 2020-05-07 08:44:21 · 152 阅读 · 0 评论 -
Leetcode_#501_二叉搜索树中的众数
原题:#501_二叉搜索树中的众数二叉搜索树是一个非递减序列,所以只需要比较当前节点与前一节点pre的值即可如果pre不存在,则当前节点为第一个节点,直接将该值放入数组,计数为1如果pre存在如果pre的值等于当前的值,则计数加1如果pre的值不等于当前值,计数置为1计数与已有最值比较如果当前计数大于已有最值,则更新最值,清空数组,添加当前节点的值如果当前计数等于已有...原创 2020-05-06 15:55:35 · 169 阅读 · 0 评论 -
Leetcode_#530_二叉搜索树的最小绝对值差
原题:#530_二叉搜索树的最小绝对值差思路:二叉搜索树的中序遍历是有序的只需要比较相邻两个节点的值即可private TreeNode preNode = null;private int minDiff = Integer.MAX_VALUE;public int f (TreeNode root) { helper(root); return min...原创 2020-05-06 15:52:45 · 264 阅读 · 0 评论 -
Leetcode_#653_两数之和Ⅳ-输入BST
原题:#653_两数之和Ⅳ-输入BST解法一:每遍历一个值,都将之与HashSet中的值进行比较若符合x+y=k,则返回true若不符合,则将之存入hashset中,然后去它的左子树和右子树中找public boolean findTarget(TreeNode root, int k) { Set<Integer> set = new HashSet(...原创 2020-05-06 15:51:11 · 134 阅读 · 0 评论 -
Leetcode_#108_将有序数组转换成二叉搜索树
原题:#108_将有序数组转换成二叉搜索树解题思路根据树的前序遍历+中序遍历可确定一棵树利用二分递归查找数组可得到所有子树的根节点根据树的中序遍历+后序遍历可确定一棵树public TreeNode f (int[] nums) { return helper(nums, 0, nums.length);}public TreeNode helper(in...原创 2020-05-06 15:49:02 · 115 阅读 · 0 评论 -
Leetcode_#235_二叉搜索树的最近公共祖先
原题:#235_二叉搜索树的最近公共祖先思路如果当前节点的值均大于p,q节点的值,那么p,q节点的最近祖先一定在当前节点的左子树当中。反之则在右子树当中若大于其中一个值,小于另一个值,那么这个点就是p,q最近公共祖先递归public TreeNode LCA(TreeNode root, TreeNode p, TreeNode q) { if (root.val ...原创 2020-05-06 15:47:04 · 117 阅读 · 0 评论 -
Leetcode_#538_把二叉搜索树转换为累加树
原题:#538_把二叉搜索树转换为累加树关键:二叉搜索树的中序遍历是有序的最大的数更新后还是它本身按照节点值降序遍历所有节点,同时记录我们已经遍历过的节点值的和,并把这个和加到当前节点的值中遍历一个没有遍历过的节点之前,先将大于点值的点都遍历一遍private int sum;public TreeNode convertBST(TreeNode root) { ...原创 2020-05-06 15:45:01 · 112 阅读 · 0 评论 -
Leetcode_#230_二叉搜索树中第k小的元素
原题:#230_二叉搜索树中第k小的元素解法一:利用数组根据搜索二叉树的性质,它的中序遍历是有序的第k小的树,也就是第[k-1]个数当遍历完左边的count个节点时,count == k表示当前遍历的节点是第k小节点private int cnt;private int ans;public int kthSmallest(TreeNode root,int k) { ...原创 2020-05-06 15:43:19 · 114 阅读 · 0 评论 -
Leetcode_#669_修剪二叉搜索树
原题:#669_修剪二叉搜索树判断当前节点:若当前节点值大于R,则将其修剪后的左子树作为最新树,自己及其右子树剪掉若当前节点值小于R,则将其修剪后的右子树作为最新树,自己及其左子树剪掉若当前节点值在[L,R]范围内,则只需要继续修剪左、右子树即可public TreeNode trimBST(TreeNode root, int L, int R) { if...原创 2020-05-06 15:41:15 · 183 阅读 · 0 评论 -
Leetcode_#94_二叉树的中序遍历
原题:#94_二叉树的中序遍历首先使用一个指针走到最左端,遍历过程中把节点依次入栈走到空时,弹出栈顶节点并访问而后使用步骤(1)的方法后遍历该节点的右孩子节点树public List<Integer> f (TreeNode root) { List<Integer> ret = new ArrayList<>(); if (ro...原创 2020-05-05 08:48:40 · 107 阅读 · 0 评论 -
Leetcode_#145_二叉树的后序遍历
原题:#145_二叉树的后序遍历二叉树的前序遍历:根-左-右二叉树的后序遍历:左-右-根把二叉树的前序遍历改为:根-右-左,即与后序遍历相反public List<Integer> f (TreeNode root) { List<Integer> ret = new ArrayList<>(); Stack<TreeNod...原创 2020-05-05 08:43:37 · 100 阅读 · 0 评论 -
Leetcode_#144_二叉树的前序遍历
原题:#144_二叉树的前序遍历public List<Integer> f (TreeNode root) { List<Integer> ret = new ArrayList<>(); Stack<TreeNode> stack = new Stack<>(); if (root == null) re...原创 2020-05-05 08:41:58 · 224 阅读 · 0 评论 -
Leetcode_#513_找数左下角的值
原题:#513_找数左下角的值使用队列保存,按:根-右-左的顺序入队,那么出队时,最后一个节点肯定是从右往左数的最后一个节点public int f (TreeNode root) { Queue<TreeNode> queue = new LinkedList<>(); queue.add(root); while (!queue.is...原创 2020-05-05 08:40:20 · 132 阅读 · 0 评论 -
Leetcode_#637_二叉树的层平均值
原题:#637_二叉树的层平均值使用队列保存每一层的节点使用数组保存每一层的平均值public List<Double> averageOfLevels(TreeNode root) { //创建一个数组放入平均值 List<Double> ret = new ArrayList<>(); if (r...原创 2020-05-05 08:38:36 · 123 阅读 · 0 评论 -
Leetcode_#671_二叉树中第二小的节点
原题:#671_二叉树中第二小的节点所有节点只会存在两个孩子节点或无孩子节点若无孩子节点,则无第二最小值,直接返回0若当前节点有左右孩子,则当前节点的值不大于孩子节点若有两个孩子节点,则候选值在孩子节点中public int findSecondMinimumValue(TreeNode root) { if(root == null || (root...原创 2020-05-05 08:37:15 · 164 阅读 · 0 评论 -
Leetcode_#337_打家劫舍Ⅲ
原题:#337_打家劫舍Ⅲ节点设置当前节点为爷爷节点下一节点为儿子节点下下节点为孙子节点偷盗情况只偷儿子(左儿子、右儿子)偷爷爷和孙子public int rob(TreeNode root) { if (root == null) return 0; int val1 = root.val; //爷爷节点的值 if (root.left...原创 2020-05-05 08:35:43 · 167 阅读 · 0 评论 -
Leetcode_#687_最长同值路径
原题:#687_最长同值路径最长同值路径存在情况:经过根节点在左子树内部在右子树内部递归:返回值:最长的同值路径长度(在左子树或右子树中)结束条件:当前根节点为空递归操作:求出当前节点的左子树最长同值长度,右子树最长同值长度。相加后与已保存的当前最长同值长度相比然后更新。递归过程中:若当前节点与它的左/右子树的节点值不相同,则该左/右子树的最长同值长度为0;...原创 2020-05-05 08:34:13 · 164 阅读 · 0 评论 -
Leetcode_#404_左叶子之和
原题:#404_左叶子之和递归:返回值:返回左子树的左叶子+右子树的左叶子之和递归操作:遍历左子树和右子树,找到叶子节点并相加结束条件:根节点为空时结束递归public int sumOfLeftLeaves(TreeNode root) { if (root == null) return 0; if (isLeaf(root.left)) return ...原创 2020-05-05 08:31:49 · 124 阅读 · 0 评论 -
Leetcode_#111_二叉树最小深度
原题:#111_二叉树最小深度关键思想:叶子节点:无孩子节点当只有root时,深度为1;只存在一个孩子节点时,返回孩子节点深度存在两孩子节点时,返回最小的深度递归:结束条件:根节点为空时结束递归操作:分别查找左右子树的深度返回值:当只有root时,深度为1;只存在一个孩子节点时,返回孩子节点深度存在两孩子节点时,返回最小的深度class Solu...原创 2020-05-03 16:22:25 · 200 阅读 · 0 评论 -
Leetcode_#572_另一个树的子树
原题:#572_另一个树的子树关键思路:A树是B树的子树的条件:两树完全相同A树是B树的左子树A树是B树的右子树递归结束条件:A或B为空则为false,AB均为空则为true递归操作:比较A是否为B的左子树,A是否为B的右子树返回值:true/falsepublic boolean isSubtree (TreeNode s, TreeNode t) ...原创 2020-05-03 16:16:14 · 177 阅读 · 0 评论 -
Leetcode_#112_路径总和
原题:#112_路径总和递归总思路:从根节点出发,每经过一个节点就用sum减去该节点的值,到达叶子节点时,判断sum是否为0结束条件:当前节点为叶子节点,判断sum是否为0,然后返回递归操作:sum减去当前节点的值,递归当前节点的所有孩子节点返回值:只要左子树或右子树当中存在一条路径即返回为真public boolean hasPathSum(TreeNode root,...原创 2020-05-03 16:05:45 · 142 阅读 · 0 评论 -
Leetcode_#226_翻转二叉树
原题:#226_翻转二叉树递归结束条件:当根节点为空时递归操作:翻转左右节点返回值:返回已交换左右节点的根节点public TreeNode invertTree(TreeNode root) { //递归函数的终止条件,节点为空时返回 if(root==null) { return null; } //下面三句是将当前节点的左右子树交换 Tree...原创 2020-05-03 15:38:36 · 125 阅读 · 0 评论 -
Leetcode_#543_二叉树的直径
原题:#543_二叉树的直径递归结束条件:当根节点为空时结束递归操作:获得左、右子树高度,两高度相加即为当前最长路径将当前最长路径与全局最长路径相比,大的为更新之后的最长路径,保存在全局变量中返回值:返回左、右子树的最大深度关键点:最长路径为全局变量最长路径为左右子树最深路径的和每一次遍历(深入)都更新最长路径private int max = 0;...原创 2020-05-03 15:33:20 · 127 阅读 · 0 评论 -
Leetcode_#110_平衡二叉树
原题:#110_平衡二叉树从上至下结束条件:当根为空时结束递归递归操作:比较左子树与右子树最大深度的差的绝对值,大于1则返回false返回值:返回的值是左/右节点的最大深度private boolean result = true; public boolean isBalanced(TreeNode root) { maxDepth(root);...原创 2020-05-03 15:28:25 · 159 阅读 · 0 评论 -
Leetcode_#104_二叉树的最大深度
原题:#104_二叉树的最大深度深度优先:递归:结束条件:当前节点为空时返回递归操作:比较左子树与右子树的深度,并返回更深者返回值:返回深度public int f (TreeNode root) { if (root == null) { return 0; } return Math.max(f(root.left),f(roo...原创 2020-05-03 15:18:44 · 108 阅读 · 0 评论 -
数据结构——链表
遍历链表的常见操作:快慢指针:#19_删除倒数第n个节点#234_回文链表设置哑节点:#19_删除倒数第n个节点双指针:几乎都要用到使用栈操作:#445_两数相加(2)...原创 2020-05-03 15:00:30 · 101 阅读 · 0 评论 -
Leetcode_#328_奇偶链表聚集
原题:#328_奇偶链表聚集分别设奇偶的链表头 ,其中,奇的链表头为原链表头分别设置奇偶指针public ListNode oddEvenList(ListNode head) { if (head == null) return null; ListNode odd = head, even = head.next, evenHead = even;...原创 2020-05-03 14:49:02 · 123 阅读 · 0 评论 -
Leetcode_#725_分隔链表
原题:#725_分隔链表将N个节点划分成K份,平均长度为N/K,余数为R=N%K若有K段,就循环K次,每一次产生一段,长度为N/K,每段添加一份Rpublic ListNode[] splitListToParts(ListNode root, int k) { ListNode[] ans = new ListNode[k]; int len = 0...原创 2020-05-03 14:44:00 · 129 阅读 · 0 评论 -
Leetcode_#234_回文链表
原题:#234_回文链表解法一:利用数组使用遍历把节点的值放置在新开辟的数组中。使用头尾指针,分别向中间靠近,过程中比较两个指针所指的值是否相等(注意是比较数组指针所指的值,而不是数组指针)public boolean isPalindrome(ListNode head) { List<Integer> vals = new ArrayList&...原创 2020-05-03 14:38:31 · 122 阅读 · 0 评论 -
Leetcode_#445_两数相加(2)
原题:#445_两数相加(2)从链表尾开始操作,首先应该想到栈的特点:先进后出设置两个栈,分别让两个链表的结点全部入栈再依次弹出,相加,相加的数为新结点注意先相加的数为低位,后相加的数为高位,所以此处需要用到不带头节点的头插法注意每一个结点只保存一位数,所以要设置一个变量保存进位(若有的话),让此变量参与下一趟运算public ListNode addTwoNumbers(Li...原创 2020-04-29 21:13:08 · 132 阅读 · 0 评论 -
Leetcode_#24_两两交换链表中的节点
原题:#24_两两交换链表中的节点递归结束条件: 当前节点或下一节点为空时结束递归递归操作:当前节点,下一节点,下下节点的位置交换返回值:返回已有序的链表片段的头节点,最后整个链表有序时间复杂度:O(n);空间复杂度:O(n),递归过程使用的堆栈空间。public ListNode f (ListNode head) { if (head == null || ...原创 2020-04-29 21:03:36 · 213 阅读 · 0 评论 -
Leetcode_#19_删除倒数第n个节点
原题:#19_删除链表的倒数第N个节点快慢指针实现一趟遍历当两个指针相差n时,慢指针的下一个结点就是要删除结点注意设置哑结点,节省删除头节点的考虑public ListNode f (ListNode head, int n) { ListNode dummy = null; dummy.next = head; ListNode p = dummy;//注...原创 2020-04-29 20:51:03 · 93 阅读 · 0 评论 -
Leetcode_#83_从有序链表中删除重复节点
原题:#83_从有序链表中删除重复节点解题思路:链表本身有序,所以若是有重复,那必是连在一起的单指针(双指针类似):时间复杂度:O(n)空间复杂度:O(1)public ListNode f (ListNode head) { if (head == null) return null; ListNode cur = head; w...原创 2020-04-29 20:43:17 · 386 阅读 · 0 评论 -
Leetcode_#21_归并两个有序链表
原题:#21_归并两个有序链表迭代新链表中允许重复结点存在两个已有链表本身有序不需要重新建立新链表两两比较结点值的大小,较大的放到下一轮继续比较,较小的并入。当短链表并入完成后,长链表剩下部分直接并入时间复杂度:O(n+m)空间复杂度:O(1)public ListNode f(ListNode headA, ListNode headB) { if (he...原创 2020-04-29 12:15:32 · 182 阅读 · 0 评论 -
Leetcode_#206_链表翻转
原题:#206_链表翻转递归结束条件:当前节点或下一节点为空时结束递归递归操作:内部局部翻转返回值:返回新的头节点(即原链表的尾节点)public ListNdoe f(ListNode head) { if (head == null || head.next == null) return head; ListNode ret = f(h...原创 2020-04-29 12:02:19 · 106 阅读 · 0 评论 -
Leetcode_#160_找出两个链表的交点
原题链接:#160_找出两个链表的交点解题思路:设A链表长a+c,B链表长b+c,可知a+c+b = b+c+a,即,两者走完自己的全程加上对方特有的一段,总路程相同,若不相同,则无交点使用双指针可解public ListNode f(ListNode headA, ListNode headB) { if (headA == null || headB == nul...原创 2020-04-29 11:46:44 · 202 阅读 · 0 评论