
数据结构与算法
数据结构与算法
花开终为谢
学生
展开
-
数据累加和
数据累计和原创 2023-01-02 21:32:21 · 336 阅读 · 1 评论 -
递归专项-114二叉树转为链表
递归专项二叉树转链表原创 2022-09-10 12:22:28 · 190 阅读 · 0 评论 -
图的深度优先遍历-两个顶点之间的最短路径
图的深度优先遍历原创 2022-09-04 18:37:56 · 807 阅读 · 0 评论 -
图的广度优先遍历——两个顶点之间的最短距离
图的广度优先遍历原创 2022-09-04 18:31:09 · 844 阅读 · 0 评论 -
递归-深度优先遍历-99. 恢复二叉搜索树
深度优先遍历,二叉搜索树原创 2022-08-28 23:40:55 · 185 阅读 · 0 评论 -
图数据结构基础篇
图数据结构基础篇原创 2022-08-28 00:36:51 · 3284 阅读 · 0 评论 -
57. 插入区间
给你一个 无重叠的 ,按照区间起始端点排序的区间列表。在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)原创 2022-07-02 19:54:48 · 446 阅读 · 0 评论 -
二分查找专题1
题目1给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。示例 1:输入: nums = [-1,0,3,5,9,12], target = 9输出: 4解释: 9 出现在 nums 中并且下标为 4示例 2:输入: nums = [-1,0,3,5,9,12], target = 2输出: -1解释: 2 不存在 nums 中因此返回 -1提示:你可以假设 num.原创 2022-04-23 23:40:22 · 169 阅读 · 0 评论 -
单调栈系列-1124.表现良好的最长时间段
难度中等175收藏分享切换为英文接收动态反馈给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。所谓「表现良好的时间段」,意味在这段时间内,「劳累的天数」是严格 大于「不劳累的天数」。请你返回「表现良好时间段」的最大长度。示例 1:**输入:**hours = [9,9,6,0,6,6,9]**输出:**3**解释:**最长的表现良好时间段是 [9,9,6]。示例 2:**输入:**h.原创 2022-04-23 18:29:48 · 358 阅读 · 0 评论 -
单调栈-最大宽度坡
题目962. 最大宽度坡难度中等160收藏分享切换为英文接收动态反馈给定一个整数数组 A,坡是元组 (i, j),其中 i < j 且 A[i] <= A[j]。这样的坡的宽度为 j - i。找出 A 中的坡的最大宽度,如果不存在,返回 0 。示例 1:输入:[6,0,8,2,1,5]**输出:**4解释:最大宽度的坡为 (i, j) = (1, 5): A[1] = 0 且 A[5] = 5.示例 2:输入:[9,8,1,0,1,9,4,0,4,1]**输出:**7.原创 2022-04-05 21:37:33 · 770 阅读 · 0 评论 -
递归专题-二叉搜索树的后序遍历序列
题目剑指 Offer 33. 二叉搜索树的后序遍历序列输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。参考以下这颗二叉搜索树: 5/ \2 6/ 1 3示例 1:输入: [1,6,3,2,5]输出: false示例 2:输入: [1,3,2,6,5]输出: true提示:数组长度 <= 1000分析首先我们先看二叉搜索树的一些特点,第一点就是左子树的值都应.原创 2022-04-05 19:51:25 · 746 阅读 · 0 评论 -
单调栈-部分有序
题目面试题 16.16. 部分排序给定一个整数数组,编写一个函数,找出索引m和n,只要将索引区间[m,n]的元素排好序,整个数组就是有序的。注意:n-m尽量最小,也就是说,找出符合条件的最短序列。函数返回值为[m,n],若不存在这样的m和n(例如整个数组是有序的),请返回[-1,-1]。示例:输入: [1,2,4,7,10,11,7,12,6,7,16,18,19]输出: [3,9]提示:0 <= len(array) <= 1000000本题可以采用单调栈的思路,比如针对1,.原创 2022-04-03 23:39:45 · 531 阅读 · 0 评论 -
递归专项-栈排序
题目面试题 03.05. 栈排序栈排序。 编写程序,对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据,但不得将元素复制到别的数据结构(如数组)中。该栈支持如下操作:push、pop、peek 和 isEmpty。当栈为空时,peek 返回 -1。示例1:输入:[“SortedStack”, “push”, “push”, “peek”, “pop”, “peek”][[], [1], [2], [], [], []]输出:[null,null,null,1,null,2.原创 2022-04-03 22:53:25 · 167 阅读 · 0 评论 -
递归专题-前序遍历构造二叉搜索树
题目:题目Id:1008题目:前序遍历构造二叉搜索树内容: //给定一个整数数组,它表示BST(即 二叉搜索树 )的 先序遍历 ,构造树并返回其根。给定一个整数数组,它表示BST(即 二叉搜索树 )的 先****序遍历 ,构造树并返回其根。保证 对于给定的测试用例,总是有可能找到具有给定需求的二叉搜索树。二叉搜索树 是一棵二叉树,其中每个节点, Node.left 的任何后代的值 严格小于 Node.val , Node.right 的任何后代的值 严格大于 Node.val。二叉树的 .原创 2022-04-03 20:44:43 · 1107 阅读 · 0 评论 -
单调栈系列1
单调栈在一维数组中找第一个满足某种条件的数,这种feel的东西一看就是单调栈题目1/** * 题目Id:739 * 题目:每日温度 * 内容: //给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指在第 i 天之后,才会有更高的温度//。如果气温在这之后都不会升高,请在该位置用 0 来代替。 //// //// 示例 1: //// //输入: temperatures = [73,74,75,71.原创 2022-03-27 17:56:11 · 272 阅读 · 0 评论 -
单调栈-每日温度
/** * 题目Id:739 * 题目:每日温度 * 内容: //给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指在第 i 天之后,才会有更高的温度//。如果气温在这之后都不会升高,请在该位置用 0 来代替。 //// //// 示例 1: //// //输入: temperatures = [73,74,75,71,69,72,76,73]//输出: [1,1,4,2,1,1,0,0]//.原创 2022-03-26 12:30:59 · 231 阅读 · 0 评论 -
并查集基础学习
图例简单描述一下:代码描述:package data.structure.unionfind;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Stack;public class UnionSet<V> { class Node<V> { private V val; public Node(V v..原创 2022-03-13 11:50:49 · 379 阅读 · 0 评论 -
递归: 如何逆序一个栈(不使用其余数据结构)
递归: 如何逆序一个栈(不使用其余数据结构)代码参考:package leetcode.editor.algorithms;import java.util.Stack;public class ReverseStack { public static void main(String[] args) { ReverseStack reverseStack = new ReverseStack(); Stack<Integer> st.原创 2022-03-12 13:10:12 · 809 阅读 · 0 评论 -
背包-最小不可组成和
题目:给定一个数组arr, 求出最小不可组成和比如数组arr [1,3,5,7], 其范围为[min,sum]即[1,16]最小不可组成和是2本题实际上是背包问题,可以使用递归,动态规划解决该题.代码:private int getMinCantCompose(int[] arr) { int min = Integer.MAX_VALUE; int sum = 0; for (int i = 0 ; i < arr.length; i+原创 2022-03-06 19:44:28 · 7658 阅读 · 0 评论 -
堆- 取两数组sum topK
题目是存在两个数组(有序)arr1, arr2, 再给一个正整数K, 返回分别来自两个数组的数字相加的和 最大的前K个。分析题目,首先该题一定是从最后的两个数组的最后索引的数字相加的和是最大的sum和,然后从最后的格子分别向左和向上走,通过最大堆的方式来处理结果。代码:package leetcode.editor.algorithms;import org.checkerframework.checker.units.qual.K;import java.util.Arrays;impor原创 2022-03-06 11:56:27 · 350 阅读 · 0 评论 -
深度优先遍历-130. 被围绕的区域
题目里面被围绕的区间不会存在于边界上,换句话说,任何边界上的 ‘O’ 都不会被填充为 ‘X’, 那么就意味着我们可以反其道而行之,凡是以边界的O开始连接的O都是不能被替换为X的,经过所有边界遍历之后,剩余下来的O则都需要替换为X就可以了。代码如下:/** * 题目Id:130 * 题目:被围绕的区域 * 内容: //给你一个 m x n 的矩阵 board ,由若干字符 'X' 和 'O' ,找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充//。// //.原创 2022-03-02 23:40:00 · 218 阅读 · 0 评论 -
深度优先遍历-200. 岛屿数量
方法1 :假设不能修改原始的数组,那么我们需要额外使用一个数组记录数据是否访问过,然后针对每一个为1的数据,通过深搜找到最大联通的岛屿,并将连接的岛屿置为访问过。 这样深搜的次数就是最终岛屿的数量。代码如下:public int numIslands(char[][] grid) { int[][] visited = new int[grid.length][grid[0].length]; int sum = 0; for (int i = 0 ;.原创 2022-03-02 22:55:11 · 331 阅读 · 0 评论 -
P387字符串中的第一个唯一字符
题目字符串中的第一个唯一字符给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。示例 1:输入: s = “leetcode”输出: 0示例 2:输入: s = “loveleetcode”输出: 2示例 3:输入: s = “aabb”输出: -1解法一:使用字符数组存储字符索引因为题目全是小写字母,这里就可以使用26范围大小的数组来完成字典映射,比如字符a,对应的数组位置为’a’-‘a’ = 0, 数组位置记录原始字符串数字字符原创 2022-02-27 14:49:28 · 102 阅读 · 0 评论 -
图结构-997
这个其实就是图里面的星形网络,中心点就是小镇法官。 他的特点就是入度是n - 1, 出度是0。 所以对应的java代码如下:class Solution { public int findJudge(int n, int[][] trust) { int[] inDegrees = new int[n + 1]; int[] outDegrees = new int[n + 1]; for (int[] edge : trust) { .原创 2022-02-23 00:05:54 · 7606 阅读 · 0 评论 -
图-133. 克隆图
题目:本题属于图这种数据结构的一个题目,可以通过深度优先遍历来求解。因为考虑到无向图,为了完成整张图的遍历,我们需要记录访问过得节点,以防止重复遍历,陷入死循环之中。Java实现代码如下:class Node { public int val; public List<Node> neighbors; public Node() { val = 0; neighbors = new Arra原创 2022-02-21 23:28:50 · 223 阅读 · 0 评论 -
递归专项-230. 二叉搜索树中第K小的元素
题目:因为二叉搜索树本身的先序排列是有序的,因此这里求取第k个最小值,可以极大复用该能力。代码:class Solution { public int kthSmallest(TreeNode root, int k) { return kthSmallestDg(root, k); } int i = 0; public int kthSmallestDg(TreeNode root, int k) { if.原创 2021-12-06 23:53:00 · 340 阅读 · 0 评论 -
递归专项-108. 将有序数组转换为二叉搜索树
题目因为题目是需要求取高度平衡的二叉搜索树,因此需要考虑列表的有序性解决该问题。class Solution { public TreeNode sortedArrayToBST(int[] nums) { return sortedArrayToBSTDg(nums, 0, nums.length - 1); } private TreeNode sortedArrayToBSTDg(int[] nums, int i, int j) { .原创 2021-12-06 23:29:26 · 157 阅读 · 0 评论 -
递归专项-129. 求根节点到叶节点数字之和
题目:code 如下:class Solution { public int sumNumbers(TreeNode root) { return sumNumbersDg(root, 0); } private int sumNumbersDg(TreeNode cur, int sum) { if (cur == null) { return 0; } if (cur.l.原创 2021-12-05 20:45:56 · 306 阅读 · 0 评论 -
递归专项-235. 二叉搜索树的最近公共祖先
题目当p,q 都小于当前节点的属性值时,说明其在左子树, 如果都大于当前节点的属性值时,说明其在右子树。code 如下:class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if (root == null) { return null; } if (p.val < roo.原创 2021-12-05 20:32:31 · 212 阅读 · 0 评论 -
递归专项-257. 二叉树的所有路径
题目257. 二叉树的所有路径给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。叶子节点 是指没有子节点的节点。 示例 1:输入:root = [1,2,3,null,5]输出:["1->2->5","1->3"]示例 2:输入:root = [1]输出:["1"]递归带返回值:code :class Solution { public List<String> binaryTreePath.原创 2021-12-02 00:04:50 · 244 阅读 · 0 评论 -
递归专项-404. 左叶子之和
题目该题目也要注意要计算的是叶子节点。 当只有一个根节点的时候,这时候实际上是不能算进内的。code:class Solution { public int sumOfLeftLeaves(TreeNode root) { return sumOfLeftLeavesDg(root, -1); } private int sumOfLeftLeavesDg(TreeNode cur, int direction) { // 一定是先会递归到叶子节.原创 2021-11-28 22:59:21 · 191 阅读 · 0 评论 -
递归专项-112. 路径总和
题目本题的一个注意点是计算的路径是从根节点到叶子节点的路径和,结尾是叶子节点(不能是根节点)code:class Solution { public boolean hasPathSum(TreeNode root, int targetSum) { return hasPathSumDg(root, targetSum); } private boolean hasPathSumDg(TreeNode cur, int sum) { .原创 2021-11-28 22:40:34 · 300 阅读 · 0 评论 -
递归专项-110. 平衡二叉树
题目code:class Solution { public boolean isBalanced(TreeNode root) { isBalancedDg(root); return flag; } boolean flag = true; private int isBalancedDg(TreeNode root) { if (root == null) { return 0; .原创 2021-11-28 22:17:07 · 171 阅读 · 0 评论 -
递归专项-222. 完全二叉树的节点个数
题目code:class Solution { public int countNodes(TreeNode root) { return countNodesDg(root); } private int countNodesDg(TreeNode root) { if (root == null) { return 0; } return countNodes(root.le.原创 2021-11-28 21:51:14 · 81 阅读 · 0 评论 -
递归专项-101. 对称二叉树
题目给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3该题目属于二叉树递归练习中的一道简单题。本质是处理镜像对称问题。 思路代码如下:class Solution { public boole.原创 2021-11-28 21:29:06 · 82 阅读 · 0 评论 -
递归专项-N叉树最大深度
题目该题目是简单的一道递归题目,针对任意一个子树,分别遍历其根节点的所有孩子节点的每个深度,取出最大的那个深度即可。代码如下:import common.NxNode;public class P559MaximumDepthOfNAryTree { public static void main(String[] args) { Solution solution = new P559MaximumDepthOfNAryTree().new Solution();.原创 2021-11-28 20:08:59 · 146 阅读 · 0 评论 -
递归专项- 记忆化搜索397. 整数替换
题目给定一个正整数 n ,你可以做如下操作:如果 n 是偶数,则用 n / 2替换 n 。如果 n 是奇数,则可以用 n + 1或n - 1替换 n 。n 变为 1 所需的最小替换次数是多少?示例 1:输入:n = 8输出:3解释:8 -> 4 -> 2 -> 1示例 2:输入:n = 7输出:4解释:7 -> 8 -> 4 -> 2 -> 1或 7 -> 6 -> 3 -> 2 -> 1示例 3:输入原创 2021-11-21 22:21:52 · 205 阅读 · 0 评论 -
递归专项-前缀树应用P677MapSum
题目实现一个 MapSum 类,支持两个方法,insert 和 sum:MapSum() 初始化 MapSum 对象void insert(String key, int val) 插入 key-val 键值对,字符串表示键 key ,整数表示值 val 。如果键 key 已经存在,那么原来的键值对将被替代成新的键值对。int sum(string prefix) 返回所有以该前缀 prefix 开头的键 key 的值的总和。 示例:输入:["MapSum", "insert", .原创 2021-11-18 22:57:13 · 184 阅读 · 0 评论 -
递归专项-给定一个二叉树计算 整个树的坡度
题目给定一个二叉树,计算 整个树 的坡度 。一个树的 节点的坡度 定义即为,该节点左子树的节点之和和右子树节点之和的 差的绝对值 。如果没有左子树的话,左子树的节点之和为 0 ;没有右子树的话也是一样。空结点的坡度是 0 。整个树 的坡度就是其所有节点的坡度之和。示例 1:输入:root = [1,2,3]输出:1解释:节点 2 的坡度:|0-0| = 0(没有子节点)节点 3 的坡度:|0-0| = 0(没有子节点)节点 1 的坡度:|2-3| = 1(左子树就是左子节点,.原创 2021-11-18 22:48:17 · 143 阅读 · 0 评论 -
递归专项-前缀树应用211. 添加与搜索单词 - 数据结构设计
题目:请你设计一个数据结构,支持 添加新单词 和 查找字符串是否与任何先前添加的字符串匹配 。实现词典类 WordDictionary :WordDictionary() 初始化词典对象void addWord(word) 将 word 添加到数据结构中,之后可以对它进行匹配bool search(word) 如果数据结构中存在字符串与 word 匹配,则返回 true ;否则,返回 false 。word 中可能包含一些 '.' ,每个 . 都可以表示任何一个字母。 示例:输入.原创 2021-11-14 18:31:48 · 136 阅读 · 0 评论