算法系列
包括leetcode、剑指Offer
MarkusZhang
水之积也不厚,则其负大舟也无力。
展开
-
左神系列|关于二叉树的总结
二叉树\二叉树的前中后遍历前序遍历在二叉树中,前序遍历的顺序就是中左右,从根节点出发,先向自己的左子树遍历,在遍历的过程中,打印节点,知道左子树为空,在遍历右子树,重复上述步骤,最后打印节点的顺序就是根节点-左子节点-右子节点它有两种实现方式:第一种是递归方式,非常简单遍历节点的时候先打印节点,然后再递归进入左子树,知道左子树为空,再进入右子树继续进行上述的流程,知道所有节点都被遍历完成第二种是非递归方式,我们需要一个栈来完成,详细流程写在下图里后续遍历第一种方式就是原创 2020-07-08 23:19:44 · 337 阅读 · 0 评论 -
左神系列|关于排序的小总结
文章目录排序选择排序简介代码实现冒泡排序简介代码实现插入排序代码实现归并排序简介代码实现堆排序简介代码实现快速排序简介代码实现桶系列--(偷个懒)排序总结排序选择排序简介选择排序的排序方式:一个数组,我们假定长度为n,从头(索引为0)遍历,第一次,我从0 ~ n-1的数中挑出一个最小值放到0位置,第二次,我从1 ~ n-1的数中挑出一个最小值放到1位置,依此类推,一直到n-1位置结束,至此排序完成代码实现/** * Author:markusZhang * Date:Create in 20原创 2020-07-01 22:46:23 · 306 阅读 · 0 评论 -
左神系列|你还在用HashMap统计单词频度吗?赶紧前缀树走起吧!
前缀树什么是前缀树?前缀树,也叫字典树,常用来保存大量的字符串(但不仅限于字符串),所以常被搜索引擎用来做文本的词频统计,还可以应用于敏感词屏蔽的场景。它的优点就是:查找、删除代价都非常低,但一般不用来删除;它的存储代价就是你要存的文本的词的字符数量之和(中文的话就是一个字,英文的话就是一个字母),将一个文本存储之后,我去查找单词的时间代价就只是这个单词的字符数量。如何生成前缀树呢?举个例子,比如给这么一组字符串:[“abc”,“abc”,“aks”],我怎么去建立一颗前缀树呢?首先构造一个对象T原创 2020-07-09 23:21:44 · 508 阅读 · 0 评论 -
左神系列|万万不能忘记的Manacher算法笔记
Manacher算法简介Manacher算法主要应用于判断最长回文子串的问题Manacher算法的步骤在说步骤之前,先说下暴力的解决的方案,遍历字符串的每个字符,以每个字符为中心,往外扩,记录往外扩的最大长度,即为最长回文子串的长度。代码最后展示言归正传,我们来说说Manacher算法是怎么解决的!它分为四种情况,在说四种情况前,我们先来明确算法中的几个基础变量:C,R,i,i’,pArr[i],先解释下这些都是干嘛的。C:表示和R对应的中心字符R:表示回文子串的右边界:可能这块有点别扭,原创 2020-07-28 00:05:02 · 176 阅读 · 0 评论 -
剑指offer系列|解题思路总结(持续更新记录)
数组篇二维数组中的查找题目描述:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解题思路:1.暴力求解法两层for循环+判断相等条件时间复杂度为O(m*n)2.巧妙解题查找规律 利用二分的思想解决问题每一行都是从左到右依次递增...原创 2020-02-10 12:30:08 · 445 阅读 · 0 评论 -
剑指offer系列|从头到尾打印链表
从头到尾打印链表题目描述:输入一个链表,按链表从尾到头的顺序返回一个ArrayList解题思路:声明一个ArrayList集合,用于存放链表的节点值采用递归的思想来解决问题代码实现: private ArrayList<Integer> aList = new ArrayList<>(); public ArrayList<Integer&g...原创 2020-01-21 17:26:16 · 157 阅读 · 0 评论 -
剑指offer系列|重建二叉树
重建二叉树题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解题思路:首先要知道前序遍历的顺序是根-左-右以及中序遍历的顺序是左-根-右的特点第一步,确定前序遍历当前序列的第一个元素为根节点,...原创 2020-01-21 17:08:41 · 140 阅读 · 0 评论 -
左神系列 | 并查集的设计以及LeetCode题目:岛屿的数量
文章目录前言并查集的设计结构实现练习题题目示例思想实现前言并查集这个结构,最适合用来解决关于连通的问题,下面介绍下并查集的思想以及附上一道LeetCode题目并查集的设计先来说下并查集结构以及思想。结构它是有三个结构,一个是元素map,一个是儿子-父亲map,一个是rankMap,第一个map是用来包装值对应的element,第二个map对应的是每个element对应的父亲element,第三个map用来装每个父element对应的该集合的大小。我们来看看代码public static c原创 2020-08-14 22:05:01 · 337 阅读 · 1 评论 -
左神系列 | leetcode滑动窗口的相关题
文章目录滑动窗口类型题滑动窗口的最大值题目:实例:思想:实现:字符串排列题目:实例:思想:代码:最大连续1的个数题目:实例:思想:代码:可获得的最大点数题目:实例:思想:代码:最长不含重复字符的子字符串题目:实例:思想:代码:替换后的最长重复字符题目:实例:思想:代码:滑动窗口类型题滑动窗口的最大值题目:给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。实例:输原创 2020-08-02 20:34:05 · 607 阅读 · 0 评论 -
左神系列|给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
无重复字符的最长子串题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例:示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“p原创 2020-07-31 11:20:46 · 385 阅读 · 0 评论 -
左神系列|单调栈的思想以及场景应用
单调栈单调栈是什么?单调栈就是一个栈结构,里面存放的内容从上到下是依次递增或者递减的。它可以用来解决在一个数组中找出每个元素对应左右两部分比自己小的值并且最近的值的情况。并且保证时间复杂度在O(n)思想是什么?给定一个数组,在遍历数组的过程中,我想把数组中元素对应的索引放入到单调栈中,怎么放呢?我们来捋下思路:在数组中不出现重复数字的时候:遍历到当前元素的时候,判断单调栈是否为空,如果为空,就将元素放入到单调栈中。如果不为空,需要判断栈顶元素和当前元素的大小,如果栈顶元素比当前元素大,那么就需原创 2020-07-29 23:45:49 · 1299 阅读 · 0 评论 -
左神系列|滑动窗口最大值详细解法
文章目录滑动窗口的最大值题目:实例:思想:实现:滑动窗口的最大值题目:给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。实例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7]解释:滑动窗口的位置 最大值[1 3 -1] -3 5 3 6 7原创 2020-07-29 10:18:28 · 783 阅读 · 0 评论 -
leetcode算法题-链表-回文链表
题目描述请判断一个链表是否为回文链表。代码实现package com.leetcode.链表;import java.util.ArrayList;import java.util.List;import java.util.Queue;import java.util.Stack;/** * Author:markusZhang * VM Args: * Date:...原创 2020-02-04 18:36:02 · 220 阅读 · 0 评论 -
leetcode算法题-链表-反转链表II
问题描述:反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。说明:1 ≤ m ≤ n ≤ 链表长度。代码实现两种算法 递归和迭代package com.leetcode.链表;/** * Author:markusZhang * VM Args: * Date:Create in 2020/2/4 14:18 */public class 反转链表II {...原创 2020-02-04 16:52:21 · 154 阅读 · 0 评论 -
leetcode算法题-链表-反转链表
题目描述反转链表代码实现package com.leetcode.链表;/** * Author:markusZhang * VM Args: * Date:Create in 2020/2/4 13:32 */public class 反转链表 { static class ListNode { int val; ListNode nex...原创 2020-02-04 14:16:30 · 175 阅读 · 0 评论 -
leetcode算法题-链表-两两交换链表中的节点
题目描述给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。代码实现package com.leetcode.链表;/** * Author:markusZhang * VM Args: * Date:Create in 2020/2/2 15:23 */public class 两两交换链表中的节点 {...原创 2020-02-02 16:52:16 · 189 阅读 · 0 评论 -
leetcode算法题-链表-两数之和II
题目描述给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。进阶:如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/add-two-...原创 2020-02-02 15:21:08 · 333 阅读 · 0 评论 -
leetcode算法题-链表-两数之和
题目描述给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/add-two-nu...原创 2020-02-02 14:56:25 · 190 阅读 · 0 评论 -
leetcode算法题-链表-设计链表
题目描述设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val 和 next。val 是当前节点的值,next 是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。在链表类中实现这些功能:get(index):获取链表中第 index 个节点的值。如果索引无效,则...原创 2020-02-02 14:20:57 · 401 阅读 · 0 评论 -
leetcode算法题-数组-四数之和
题目描述给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。注意:答案中不可以包含重复的四元组。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/4sum著作权归领...原创 2020-02-02 13:37:28 · 214 阅读 · 0 评论 -
leetcode算法题-数组-最接近的三个数的和
题目描述给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/3sum-closest著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。...原创 2020-02-01 17:13:11 · 809 阅读 · 0 评论 -
leetcode算法题-数组-三数之和
题目描述给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组注意:答案中不可以包含重复的三元组。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/3sum著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。代...原创 2020-02-01 16:10:46 · 343 阅读 · 0 评论 -
leetcode算法题-数组-两数之和II-输入有序数组
题目描述给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。说明:返回的下标值(index1 和 index2)不是从零开始的。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。来源:力扣(LeetCode)链接:https://leetco...原创 2020-02-01 15:08:09 · 184 阅读 · 0 评论 -
leetcode算法题--数组-两数之和
题目描述给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/two-sum著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明...原创 2020-02-01 14:53:12 · 270 阅读 · 0 评论 -
leetcode 21题:合并两个有序链表
合并两个有序链表题目描述:将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。题目示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4解题思路:两个有序链表分别声明一个指定该链表的当前节点的指针比较两个指针所指向的节点的元素大小,根据题意,得出比较结果为...原创 2020-01-21 15:43:02 · 186 阅读 · 0 评论