
数据结构与算法
文章平均质量分 65
yingwenmingyangqi
这个作者很懒,什么都没留下…
展开
-
leetcode---验证二叉树的前序列化
/*题目:序列化二叉树的一种方法是使用前序遍历。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如 #。 _9_ / \ 3 2 / \ / \ 4 1 # 6/ \ / \ / \# # # # # #例1:输入: "9,3,4,#,#,1,#,#,2,#,6,#,#"输出: true例2:输入: "1,#"输出: false例3:输入: "9,#,#,1"输出: fal.原创 2021-05-27 21:05:12 · 73 阅读 · 0 评论 -
leetcode---不同字符的最小序列
/** 返回 s 字典序最小的子序列,该子序列包含 s 的所有不同字符,且只包含一次。* 例1:输入:s = "bcabc" 输出:"abc"* 例2:输入:s = "cbacdcbc" 输出:"acdb"** */package cn.wanggeng.stack;import java.util.ArrayDeque;import java.util.Deque;public class SmallestSubsequence { public S.原创 2021-05-25 15:17:54 · 184 阅读 · 0 评论 -
leetcode---二叉树的交叉打印
/** 题目:二叉树的交叉遍历(给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行。))*例如:给定二叉树 [3,9,20,null,null,15,7],* 3 / \ 9 20 / \ 15 7 输出: * [ [3], [20,9], [15,7]]*算法:广度优先遍历加层数判断,如果层数为奇数层,就从左往右遍历,如果层数为偶数层,就从右往左遍历。使用双端队列进行.原创 2021-05-19 10:53:30 · 220 阅读 · 0 评论 -
leetcode---简化路径问题
/**给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为更加简洁的规范路径。在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//')都被视为单个斜杠 '/' 。 对于此问题,任何其他格式的点(例如,'...')均被视为文件/目录名称。请注意,返回的 规范路径 必须遵循下述格式: 始终以斜杠 .原创 2021-05-17 11:44:41 · 139 阅读 · 0 评论 -
leetcode --- 递增搜索二叉树
/*题目描述:给你一棵二叉搜索树,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。*算法:[1] 对给定二叉搜索树进行中序遍历,使用一个list集合来存储所遍历过程中的每个节点的值,然后遍历这个list集合,来创建一棵二叉树。* [2] 在中序遍历过程中通过改变所遍历节点的左右节点的指向,来重新塑造二叉树* * Definition for a binary tree node. * public c...原创 2021-04-29 15:44:01 · 142 阅读 · 0 评论 -
leetcode---对象二叉树
/*问题描述:判断一颗二叉树是否为对称二叉树,比如 1 / \ 2 2 / \ / \3 4 4 3 是一颗对称二叉树 1 / \ 2 2 \ \ 3 3 不是一颗对称二叉树 算法思想:(1)递归,思考对称二叉树的性质:如果一个二叉树的左子树和右子树镜像对称,那么这个树就是对称的。因此该问题可以转化为: [1] 两颗树具有相同的根节点 [2] 每个树的右子树都与另一个树的左子树镜像对称(也就是.原创 2021-04-28 11:35:11 · 123 阅读 · 0 评论 -
mysql性能优化(一)
mysql性能优化的几个方面:(1)SQL及索引优化【1】查看MySQL慢查日志是否开启:show variables like 'show_query_log';【2】'log_queries_not_using_indexes'变量表示是否把没有使用索引的sql记录到慢查询日志中,该值为off时表示不记录,该值为on时表示记录,(set global log_queries_not_using_indexes = on)【3】‘long_query_time’变量表示把超过多少s原创 2021-04-26 20:16:58 · 93 阅读 · 0 评论 -
KMP算法原理以及java代码实现
例题描述:String haystack = "abcabaabaabcacb";String needle = "abaabcac"; 求字符串needle与字符串haystack的子串匹配的部分,返回haystack字符串匹配初的起始位置。KMP算法:KMP算法的核心思想是求解next[]数组,next[]数组的含义是所求串中前缀与后缀相等的最大长度。比如needle字符串的值为“abaabcac”,那么其的next数组为:needle a b a a b ..原创 2021-04-25 16:34:25 · 183 阅读 · 0 评论 -
leetcode---链表回环问题2
问题描述:给定一个链表,判断该链表是否是回环链表,如果是,则返回链表环的入口位置,如果不是,则返回空。算法思想:(1)遍历链表,使用HashSet来判断链表中的某个节点是否已经被遍历过。 (2)双指针,定义一个快指针fast和一个慢指针slow,快指针每次向前移动两步,慢指针每次向前移动一步。设链表入环前的长度为a,环内的长度为b,走的环 圈数为n,则两个指针第一次相遇时,快指针fast走的长度为f=...原创 2021-03-11 11:22:56 · 257 阅读 · 0 评论 -
leetcode----不同路径问题
题目描述:一个机器人在一个m*n的方格里,试问从左上角走到左下角共有多少种路径?解题思路:设机器人的位置为f(0)(0),终点右下角位置为f(m-1)(n-1),那么去终点位置的上一步有两种情况,即f(m-1-1)(n-1)+f(m-1)(n-1-1)。 但是当m=0,n=0时,不符合这种情况,f(0)(0),f(0)(n-1),f(m-1)(0)只有一种到达情况。代码:public class Path { public int...原创 2021-03-10 10:47:27 · 107 阅读 · 0 评论 -
leetcode---除自身外的数组的乘积
/** 给定一个都是int类型的数组,输出一个新数组,新数组中的每个元素等于给定数组中除该位置的元素其他所有因素的乘积。* 算法:创建两个数组L和R,L数组中的每个元素的值等于其左边所有元素的乘积,即 L[i] = L[i-1] * nums[i-1];* R数组中的每个元素的值等于其右边所有元素的乘积,即R[i] = R[i+1] * nums[i+1].* 由于L[0]和R[length-1]的左右都没有元素,故L[0]和R[length-1]的值设为1。* */p.原创 2020-12-24 17:09:47 · 158 阅读 · 1 评论 -
leetcode---全排列问题
/** 给定一个 没有重复 数字的序列,返回其所有可能的全排列。例如[1,2,3],输出* [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]** */import java.util.ArrayList;import java.util.List;public class Permutation { public List<List<Integer>> permut.原创 2020-12-21 21:06:32 · 114 阅读 · 0 评论 -
leetcode---正方形矩阵
/** 给定一个int类型的数n,顺序输出一个螺旋排列的正方行矩阵,比如当n=3时,输出[ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ]]*算法:设定上下左右四个边界,每遍历一轮就调整临界值,比如:* 当从左到右填完后,上边界+1,相当于上边界向内缩。* */import java.util.Arrays;public class SquareMatrix { public int[][] matrix(int n){ .原创 2020-12-14 11:13:32 · 757 阅读 · 1 评论 -
leetcode---最长公共前缀
/** 要求:找出给定字符数组中的每个字符的最长公共前缀。* 算法1:横向扫描:将给定数组中的第一个字符串与第二个进行比较,得出公共前缀后用该前缀继续与第三个字符串进行比较,再得出新的公共前缀,依次与各个字符串比较后得到* 的公共前缀即为所求前缀。在比较过程中,如果遇到公共前缀为空,则直接跳出循环,返回无公共前缀。* 算法2:纵向扫描:将字符数组中的第一个字符串作为对比指标,与数组中的其他字符串依次比较其每一个下标,当比较的下标值不同时,就返回对比指标此下标值之前的元素.原创 2020-12-08 16:33:23 · 92 阅读 · 0 评论 -
leetcode---有效括号问题
/** 有3种括号,({[必须与)}]正确匹配,只需要考虑括号的匹配性,不需要考虑优先级。* 算法思想:使用栈数据结构,当遇到左括号的时候入栈,遇到右括号的时候出栈,这样后进栈的左括号必须与先遇到的右括号匹配,否则返回false.* */import java.net.StandardSocketOptions;import java.util.Deque;import java.util.HashMap;import java.util.LinkedList;import java.u.原创 2020-12-07 18:14:11 · 158 阅读 · 0 评论 -
leetcode---判断是否为2的幂
/** 判断给定数是否为2的幂。* 1.判断该数是否能被2整除,若不能整除,直接返回false,若能整除,再判断最后除2的商是否等于1,若等于1,则返回true,否则返回false。* 2.若一个数是2的幂数,则它的二进制表示只存在一个1,且该1位于二进制的最右边。使用&运算,运算(x & (-x))则只保留x二进制的最右边的1。* 比如:x = 6 的二进制表示: 0000 0110* -x 的二进制表示:1111 1010* x &.原创 2020-12-04 10:30:32 · 157 阅读 · 0 评论 -
leetcode---两个排序数组重新排序
/** 将两个已排序数组重新排序,重新排序的数组用已知数组接收,假设该数组长度足够大。* 1.使用java API来完成* 2.使用双指针(从前往后),需要使用一个额外数组空间。* 3.使用双指针(从后往前),不需要额外使用空间。* */import java.util.Arrays;public class MergeOrderArray { public static void main(String[] args) { MergeOrderArray m =.原创 2020-12-03 18:25:10 · 371 阅读 · 0 评论 -
leetcode---链表回环问题
/*判断链表是否有回环。* 1.哈希表:利用HashSet的contains方法来判断是否已经存在该ListNode元素,或者利用HashSet的去重复机制,来判断是否存在该元素,从而判断是否有回环。* 2.双指针:定义一快一慢指针,若链表存在回环,则两指针必须会相遇。* 判断的初始条件为slow == fast 结束循环,故初始化时fast不能和slow同为开始节点。* * class ListNode { * int val; * ListNode ne.原创 2020-12-03 16:08:12 · 424 阅读 · 0 评论 -
leetcode---爬楼梯问题
/** 爬楼梯问题:每一次可以选择爬1层或者爬2层。求爬n层楼梯有几种选择* 1.动态规划:爬n层楼梯的选择为f(n),那么f(n) = f(n-1) + f(n-2)。* 2. 尾递归,比直接递归的好处是不需要记录本次递归前的函数状态,时间消耗少。* */package cn.wanggeng;import java.awt.desktop.SystemSleepEvent;public class ClimbStairs { public int climbStairs(i.原创 2020-12-03 15:36:32 · 191 阅读 · 0 评论 -
leetcode---最大子集和
/** 问题:求一个给定数组中的最大连续元素和。* 以Ai代表数组中截止下标为i的子数组最大连续元素和(i=0,1,2...* 求Ai可以考虑将Ai分为该截止元素+之前元素的和与该截止元素两部分,求最** */public class MaxSubArray { public int maxSubArray(int[] nums) { int pre = 0; int maxsubarray = nums[0]; for(int num: num.原创 2020-12-02 14:35:54 · 334 阅读 · 0 评论 -
leetcode---重复元素
判断某个数组中是否有重复元素,重复元素指有2个或2个以上的元素。public class ContainsDuplicate { //第一种方法,利用HashSet的不可重复特性 public boolean containsDuplicate(int[] nums) { Set<Integer> set = new HashSet<>(nums.length); for (int x: nums) {.原创 2020-12-01 15:45:06 · 93 阅读 · 0 评论 -
leetcode---相交链表问题
目的:找到两个链表的相交节点并且返回该节点。示例:在节点c1处相交算法思想:因为两个链表的总长度一定,所以遍历A+B链表,如果A、B两节点相交,则末尾节点一定相同。 遍历两个单链表,若A链表第一次遍历完后,将该末尾节点指向B链表的头节点,同理,B链表遍历完后,将末尾节点指向A链表的头节点, 如果遍历途中两个链表在某个节点相遇,这个节点即为相交节点,如果两个链表遍历完后没有相遇,则两个链表没有相交。publ...原创 2020-11-30 10:40:53 · 123 阅读 · 0 评论 -
leetcode---回文数
回文数:正反两个方向读起来的数字相等public class Palindrome { public boolean isPalindrome(int x) { int revertednumber = 0; if(x<0 || x%10 == 0 && x != 0){ return false; } while(revertednumber < x){ ..原创 2020-11-27 17:22:30 · 134 阅读 · 0 评论 -
leetcode---二叉搜索树的最近祖先问题
/** 二叉搜索树的两个节点的最近祖先问题* 二叉搜索数的特点:左子树节点的值全部小于根结点的值,右子树节点的值全部大于根结点的值* 要找两个给定节点的最近祖先,可以通过记录从根节点到两个指定节点的路径,通过遍历,找到两个路径中最后一次节点相同的值* 这个值就是两个节点的最近祖先* */public class LowestCommonAncestor { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, T.原创 2020-11-25 10:28:20 · 120 阅读 · 0 评论 -
leetcode---子集问题
1.回朔算法(一)求某个数组的子集,相当于遍历一颗n叉树,走过的每条路径就是每一个子集。 代码实现:public List<List<Integer>> subset2(int nums[]){ List<List<Integer>> res = new ArrayList(); ...原创 2020-11-19 10:33:58 · 295 阅读 · 0 评论 -
排序算法(二)
3.直接插入排序(1)算法思想:从第一个元素开始,可以将第一个元素视为已排序,之后从待排序数组取出下一个元素,在已排序元素序列中从后往前扫描,如果已排序元素序列中的某个元素大于新元素,则将该元素移到下一位置,依次重复上述步骤,直到找到已排序元素小于或者等于新元素的位置;则将新元素插到该元素位置后。(2)代码实现: public int[] sortArray(int[] A){ int temp = 0; for(int i=0; i<A.len原创 2020-10-20 10:00:53 · 123 阅读 · 0 评论 -
排序算法(一)
注:以下排序算法都按从小到大的顺序排序1.冒泡排序(1)算法思想:从数组中的第一个元素开始,依次比较相邻两个元素之间的大小,将较小的元素排在前面,这样每轮会在数组末尾选出一个最大的数,一共需要比较N-1轮(N为数组长度)。(2)代码实现:import java.util.Arrays;public class Demo02 { public int[] sortArray(int[] A){ int temp = 0; for(int原创 2020-10-19 18:18:08 · 270 阅读 · 0 评论