
算法+数据结构+设计模式
文章平均质量分 63
1111111111111111111
morning sunshine
用心记笔记。
展开
-
辗转相除法
【代码】辗转相除法。原创 2024-11-24 11:25:46 · 206 阅读 · 0 评论 -
两数相加的时候警惕int类型溢出
该题目是因为二分查找,但是两个数比较大,如果直接使用int类型相加,会出现溢出,导致二分查找一直出错。如果场景中,这两个数是可能比较大的,那么不能直接使用int类型进行相加,因为可能会出现溢出操作。...原创 2022-07-22 16:24:14 · 1205 阅读 · 0 评论 -
双指针法-滑动窗口策略
内容来自:《labuladong的算法小抄》一,什么是滑动窗口:滑动窗口其实思路非常简单,就是维护一个窗口,不断滑动,然后更新答案。· 二,举例:最小覆盖子串:力扣https://leetcode.cn/problems/minimum-window-substring/76. 最小覆盖子串难度困难1890给你一个字符串s、一个字符串t。返回s中涵盖t所有字符的最小子串。如果s中不存在涵盖t所有字符的子串,则返回空字符...原创 2022-05-23 20:01:22 · 838 阅读 · 0 评论 -
快慢指针问题
一,题目:力扣https://leetcode.cn/problems/linked-list-cycle/141. 环形链表难度简单1498给你一个链表的头节点head,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos不作为参数进行传递。仅仅是为了标识链表的实际情况。如果链表中存在环,则返回true...原创 2022-05-21 23:08:09 · 182 阅读 · 0 评论 -
全排列问题:回溯法
回溯法的注意点:1,递归调用之后,即递归方法的下一行,一定要进行回溯一级!2,递归触底之后,也是一定要回溯一级!·题目案例:给你一个数字n,请你生成并返回所有 从 1 到 n 可能的全排列 。你可以 按任意顺序 返回答案。比如:输入:n = 3输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]·思路:把从1~n的每个数字,抽象成一个以该元素为根节点的多叉树,以n为4举例,如图:这是以1为根节点的多叉原创 2022-05-07 16:31:12 · 2026 阅读 · 0 评论 -
判断一个二叉树是否是平衡二叉树
题目:题目链接:力扣https://leetcode-cn.com/problems/balanced-binary-tree/110. 平衡二叉树难度简单991给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1 。示例 1:输入:root = [3,9,20,null,null,15,7]输出:true示例 2:输入:root = [1,2,2,3,3.原创 2022-04-30 16:03:46 · 4739 阅读 · 0 评论 -
计算二叉树的某个节点的高度
参考链接:力扣https://leetcode-cn.com/problems/balanced-binary-tree/solution/ping-heng-er-cha-shu-by-leetcode-solution/·公式:定义函数 height,用于计算二叉树中的任意一个节点 p 的高度:只能先递归向下,然后回溯,回溯时累加求出高度;公式就是:当前node节点的高度=【(node节点的左子树的高度)VS (node节点的右子树的高度)...原创 2022-04-30 15:35:10 · 3343 阅读 · 1 评论 -
如何从二叉搜索树中查找某个节点、以及记录查找路径
一,题目:题目链接:力扣https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-search-tree/235. 二叉搜索树的最近公共祖先难度简单825收藏分享切换为英文接收动态反馈给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也原创 2022-04-30 11:06:16 · 3079 阅读 · 0 评论 -
快速排序--指针交换法详解
11111111111111原创 2022-03-29 15:18:06 · 1431 阅读 · 0 评论 -
快速排序--挖坑法详解
一,思想描述:何谓挖坑法?我们来看一看详细过程。给定原始数列如下,要求从小到大排序:首先,我们选定基准元素Pivot,并记住这个位置index,这个位置相当于一个“坑”。并且设置两个指针left和right,指向数列的最左和最右两个元素:接下来,从right指针开始,把指针所指向的元素和基准元素做比较。如果比pivot大,则right指针向左移动;如果比pivot小,则把right所指向的元素填入坑中。在当前数列中,1<4,所以...原创 2022-03-29 15:17:35 · 2338 阅读 · 0 评论 -
(图)深度优先搜索DFS和广度优先搜索BFS
视频链接:数据结构与算法基础-java版(罗召勇)_哔哩哔哩_bilibili1.1)什么是图结构图中的一个一个的点称为顶点;这一条一条的线,代表着顶点之间的关系,我们将其称之为边。如果两个顶点之间可以通过一条边进行连通,那么就将这两个点称为是邻接的,反之就不是邻接的。比如说B和C、B和A这些顶点之间就是邻接的,而A和D就不是邻接的。有向图和无向图指的就是边是否是有方向的。如图所示:带权图指的就是,我们可以给图中的边,给它标识上一个有意义的数据值,比如...原创 2022-02-25 11:05:00 · 759 阅读 · 0 评论 -
合并二叉树
一,题目:给你两棵二叉树: root1 和 root2 。想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。返回合并后的二叉树。注意: 合并过程必须从两个树的根节点开始。示例 1:输入:root1 = [1,3,2,5], root2 = [2,1,3,null,4,n原创 2022-01-29 21:51:59 · 975 阅读 · 0 评论 -
斐波那契数列_3种解法
题目描述:剑指 Offer 10- I. 斐波那契数列难度简单282写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项(即F(N))。斐波那契数列的定义如下:F(0) = 0, F(1)= 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。...原创 2022-01-11 10:40:05 · 651 阅读 · 0 评论 -
数据结构与算法学习笔记2
一,在我所知道的算法中,图算法应该是最有用的。解决问题需要三个步骤:分析题意; 使用相应的数据结构,来建立问题模型; 使用相应的算法来解决问题二,对数与大O表示法1)对数:你可能不记得什么是对数了,但一定记得什么是幂,表示将多少个10相乘等于100,答案是2个。因此=2;对数运算是幂运算的逆运算。使用大O表示法讨论算法的运行时间的时候,log指的都是,比如log8=3(因为=8),比如log1024=10(因为=1024)。在算法的时间复杂度的计算中,经常会用到log时间,原创 2021-12-21 06:26:17 · 304 阅读 · 0 评论 -
动态规划_学习笔记
摘自——《算法图解》在我所知道的算法中,图算法应该是最有用的。解决问题需要三个步骤:分析题意; 使用相应的数据结构,来建立问题模型; 使用相应的算法来解决问题;学习动态规划,这是一种解决棘手问题的方法,它将问题分成小问题,并先着手解决这些小问题。学习动态规划的重点在于——如何设计问题的动态规划解决方案。以背包问题为例:假设你是个小偷,背着一个可装4磅东西的背包。你可盗窃的商品有如下3件。音响:3000美元,4磅; 笔记本电脑:2000美元,3磅; 吉他...原创 2021-12-19 21:41:56 · 403 阅读 · 0 评论 -
散列表_学习笔记
1)哈希表简介:散列表又称为哈希表,也被称为散列映射,映射,字典,关联数组等。散列表的查找、插入、删除速度都很快,目前大多数优秀的编程语言都提供了散列表实现。除此之外,因为哈希表的key不允许重复,所以散列表还非常适合用于防止重复。散列表存储元素的形式由键和值组成。2)散列表的结构:散列表这种数据结构由散列函数和数组组成;相比于数组和链表,散列表更为复杂一些些,它使用散列函数来确定元素的存储位置;在平均情况下,散列表的查找速度与数组一样快,而插入和删除的速度和链表一样快,因此原创 2021-12-18 17:13:50 · 1313 阅读 · 0 评论 -
对数与大O表示法——算法
你可能不记得什么是对数了,但一定记得什么是幂,log1原创 2021-12-13 07:15:54 · 1346 阅读 · 0 评论 -
二叉排序树的删除节点
步骤:首先,我们先从根节点开始查找到要删除的这个节点,然后删除该节点,然后再妥善安置该该节点的子树或子节点。要删除的节点分为三种情况:1,当要删除的节点的是叶子结点的时候;2,当要删除的节点只有一个子节点或子树的时候;3,当要删除的节点同时有左右两棵子树的时候。对于第一种情况,要删除的节点是叶子结点的时候,删除的办法是直接删除掉该节点即可;对于第二种情况,要删除的节点有一个子节点或子树的时候,删除的办法是先将该节点删除,然后将它的子节点或子树直接挪到该节点的位置即可。对于第三种情况,要...原创 2021-11-30 07:44:24 · 5538 阅读 · 0 评论 -
二叉排序树的创建
/** * 构造一棵二叉排序树,添加节点: * @param array1 */ public static BinaryTreeNode createBinaryOrderTree(int[] array1) { //根节点: BinaryTreeNode rootNode = new BinaryTreeNode(); //遍历数组,以数组第一个元素为根节点,将数组中的元...原创 2021-11-30 06:58:40 · 2158 阅读 · 0 评论 -
最大子序和
题目描述:53. 最大子序和给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例 1:输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。示例 2:输入:nums = [1]输出:1示例 3:输入:nums = [0]输出:0示例 4:输入:nums = [-1]输出:-1示例 5:输入:nums = [-100000.原创 2021-11-04 16:32:31 · 1281 阅读 · 0 评论 -
回文链表_使用栈数据结构来解决
题目描述:234. 回文链表难度简单1137给你一个单链表的头节点head,请你判断该链表是否为回文链表。如果是,返回true;否则,返回false。力扣示例 1:输入:head = [1,2,2,1]输出:true示例 2:输入:head = [1,2]输出:false提示:链表中节点数目在范围[1, 105]内 0 <= Node.val <= 9进阶:你能否用O(n)时间复杂度和O(...原创 2021-10-03 22:30:02 · 390 阅读 · 0 评论 -
关于栈和队列的一些简单概念
1,Stack类和Deque类,优先使用谁?Stack类表示对象的后进先出 (LIFO) 堆栈。 它使用五个操作扩展了Vector类,这些操作允许将向量视为堆栈。 提供了通常的push和pop操作,以及查看栈顶项目的方法,测试栈是否为空的方法,以及搜索栈中某项并发现它多远的方法是从顶部。首次创建堆栈时,它不包含任何项目。Deque接口及其实现提供了一组更完整和一致的 LIFO 堆栈操作,应优先使用此类。2,队列Queue的offer方法与add方法的区别:相同点:都是将指定元素插入...原创 2021-10-03 16:42:05 · 134 阅读 · 0 评论 -
用两个栈实现队列
题目描述:剑指 Offer 09. 用两个栈实现队列难度简单318用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead操作返回 -1 )示例 1:输入:["CQueue","appendTail","deleteHead","deleteHead"][[],[3],[],[]]输出:[null,null,3,-1]示例...原创 2021-10-03 16:37:17 · 180 阅读 · 0 评论 -
用队列实现栈
问题描述:225. 用队列实现栈难度简单385请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop和empty)。实现MyStack类:void push(int x)将元素 x 压入栈顶。 int pop()移除并返回栈顶元素。 int top()返回栈顶元素。 boolean empty()如果栈是空的,返回true;否则,返回false。注意:你只能使用队列的基本操作 —— 也就是pus...原创 2021-10-03 11:21:49 · 157 阅读 · 0 评论 -
最小栈_辅助栈存储最小元素
155. 最小栈难度简单1041设计一个支持push,pop,top操作,并能在常数时间内检索到最小元素的栈。push(x)—— 将元素 x 推入栈中。 pop()—— 删除栈顶的元素。 top()—— 获取栈顶元素。 getMin()—— 检索栈中的最小元素。示例:输入:["MinStack","push","push","push","getMin","pop","top","getMin"][[],[-2],[0],[-3],[],[],[],[]]...原创 2021-10-02 22:04:11 · 208 阅读 · 0 评论 -
二叉树的中序遍历
力扣https://leetcode-cn.com/problems/binary-tree-inorder-traversal/给定一个二叉树的根节点root,返回它的中序遍历。输入:root = [1,null,2,3]输出:[1,3,2]示例 2:输入:root = []输出:[]示例 3:输入:root = [1]输出:[1]输入:root = [1,2]输出:[2,1]输入:root = [1,null,2]输出:[1,2]代码示例:...原创 2021-09-24 16:20:41 · 248 阅读 · 0 评论 -
顺序存储的二叉树
顺序存储的二叉树通常情况只考虑完全二叉树,因为对于一个非完全二叉树来说,顺序存储是没有意义的。对于一个顺序存储的二叉树有什么性质:1,第n个元素的左子结点是:2*n+1; 2,第n个元素的右子节点是:2*n+2; 3,第n个元素的父节点是:(n-1)/2;...原创 2021-09-23 21:52:22 · 285 阅读 · 0 评论 -
关于树的一些简单概念
1,根节点;2,双亲节点;3,子节点;4,路径;5,节点的度;6,节点的权;7,叶子节点;8,子树;9,层;10,树的高度;11,森林;示意图:1,根节点:2,双亲节点:上边箭头那个节点就是下边的两个节点的双亲节点,既是父节点又是母节点,所以称为双亲节点;3,子节点:下边那两个箭头指向的就是上边那个节点的两个子节点;4,...原创 2021-09-13 21:30:57 · 792 阅读 · 0 评论 -
栈的使用——《有效的括号》
题目链接:力扣https://leetcode-cn.com/problems/valid-parentheses/solution/you-xiao-de-gua-hao-by-leetcode-solution/一, 规律与思想:1,从左往右,遇到的第一个右括号,一定是和它紧挨左边的那个左括号是一对的,否则就是false;2,先进后出的规律:先出现的左括号后匹配,后出现的左括号先匹配;这就是先进后出的模式,那么可以使用栈这种数据结构来辅助完成操作;3,我们可以把左括...原创 2021-09-12 12:52:48 · 181 阅读 · 0 评论 -
汉诺塔问题
递归原理,所有的盘子永远只分为两部分:最下边的盘子和上边的盘子。package per.zhangyh.algorithm.hannuota;/** *@author:zhangyonghui; *@date: 2021/6/20; 15:19 *@Describe:汉诺塔问题 */public class HanNuoTa1 { public static void main(String[] args) { hannuota(4, "左边托盘", "中间托盘.原创 2021-06-20 16:01:50 · 107 阅读 · 0 评论 -
斐波那契数列
2021-05-10学习视频:https://www.bilibili.com/video/BV1Zt411o7Rn?p=17什么是斐波那契数列:斐波那契数列是递归的典型应用;①,前两项数除外,都是1;②,从第三项起,每一个数都是它前两个数的和;比如:1 1 2 3 5 8 13 21 ...代码:package per.zhangyh.algorithm.data_structure.code;/** *@author:zhangyonghui; *@...原创 2021-05-10 08:02:57 · 289 阅读 · 0 评论 -
双向循环链表
2021-05-09学习视频:https://www.bilibili.com/video/BV1Zt411o7Rn?p=16思想:为当前节点追加一个节点:1,先找出该节点的下一个节点,存放起来;2,将新结点设置为当前节点的下一个节点,将当前节点设置为新结点的上一个节点;3,将步骤1的节点设置为新结点的下一个节点,将新结点设置为步骤1的节点的上一个节点;1,当只有一个节点的时候,该节点的上一个节点、下一个节点,都指向它自己;2,为当前节点-节点1,追加节点2..原创 2021-05-09 18:11:21 · 108 阅读 · 0 评论 -
较大分组的位置
* 830. 较大分组的位置* 在一个由小写字母构成的字符串 s 中,包含由一些连续的相同字符所构成的分组。** 例如,在字符串 s = "abbxxxxzyy" 中,就含有 "a", "bb", "xxxx", "z" 和 "yy" 这样的一些分组。** 分组可以用区间 [start, end] 表示,其中 start 和 end 分别表示该分组的起始和终止位置的下标。上例中的 "xxxx" 分组用区间表示为 [3,6] 。** 我们称所有包含大于或等于三个连续字符的分组为 较大分组 。..原创 2021-01-05 22:49:53 · 114 阅读 · 0 评论 -
两数之和
* 1. 两数之和* 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。** 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。** 你可以按任意顺序返回答案。**** 示例 1:** 输入:nums = [2,7,11,15], target = 9* 输出:[0,1]* 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。* 示例 2:*..原创 2021-01-05 22:43:12 · 215 阅读 · 0 评论 -
斐波那契数
package per.zhangyh.leetcode.simple;/** *@author:zhangyh_oup_bj; *@date: 2021/1/4; 20:16 *@Describe: * 斐波那契数,通常用F(n) 表示,形成的序列称为 斐波那契数列 。该数列由0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: * * F(0) = 0,F(1)= 1 * F(n) = F(n - 1) + F(n - 2),其中 n > 1 * 给你 n ...原创 2021-01-05 22:40:47 · 105 阅读 · 0 评论 -
冒泡排序
一,思想:冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个相邻记录,如果反序则交换,直到没有反序的记录为止。每一轮比较,需要比较的数列都会减少/变化,因为每一轮冒泡上浮出来的数已经不需要比了。二,时间复杂度: 冒泡排序的平均时间复杂度是O(n²)。三,代码:package maopao2;/**...原创 2020-05-01 14:50:01 · 151 阅读 · 0 评论 -
二分查找
二分查找1)二分查找,又称为 折半查找;存储结构采用一维数组。2)二分查找有个大前提:-------------------- 数组的元素必须是有序的!!!`步骤:确定整个查找区间的中间位置 mid = ( left + right )/ 2用待查的数值与中间位置的元素值进行比较;-------2.1 若相等,则查找成功;-------2.2 若 待查数值 ...原创 2020-03-16 18:28:17 · 144 阅读 · 0 评论 -
选择排序—思路+代码
选择排序选择排序:(一直选择“第一位置元素”,与后边的数进行比较.)选择第一个数,第一个数成为最小元素之后,再选择第二个数,第二个数成为除第一个元素之外最小的数(即,新的第一位置元素)之后,再选择第三个数…·思想:1)让数组中的第一个数,依次与它后面的那些数们进行比较,1.1)如果第一个数小于等于后面的数,不交换,继续遍历;1.2)如果第一个数大于后面的数,就进行位置的交换。交...原创 2020-03-16 15:15:13 · 242 阅读 · 0 评论 -
插入排序—思路+代码
插入排序:思想:插入排序和打牌一样,核心:数小往前插,数大则不管。一个数只和它前面的那个数进行比较,如果比前面的数小,则该元素往前边插去(交换位置),然后继续向前进行新的比较;如果比前面的数大,则不将该元素往前插入(即,不管该数了),直接进行去轮询到(后边的)下一个元素;时间复杂度:插入排序的平均时间复杂度是O(n²)。eg——举例: 4,2,5,1,7 第一...原创 2020-03-16 10:05:24 · 284 阅读 · 0 评论 -
冒泡排序--思路+代码
冒泡排序:1)冒泡排序介绍:冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行,直到没有再需要交换的数,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。2) 冒泡排序 思路:比较两个相邻的下标对应的元素,如果符合条件就交换位置(最值出现在最后位) ;...原创 2020-03-16 09:05:10 · 379 阅读 · 0 评论