
算法
酱学编程
系统架构师,软件设计师
展开
-
【算法】二叉树- 递归方法论
的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。的,那么就在递归函数里加上这个参数, 并且还要明确。: 写完了递归算法, 运行的时候,经常会遇到。进而确定递归函数的返回类型。原创 2024-07-10 23:42:44 · 222 阅读 · 0 评论 -
【算法】二叉树-基础知识与应用
int val;原创 2024-07-10 23:23:12 · 292 阅读 · 0 评论 -
【算法】数组-基础知识与应用
数组是存放在连续内存空间上的相同类型数据的集合。数组可以方便的通过下标索引的方式获取到下标对应的数据。因为数组在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。原创 2024-06-24 23:37:02 · 376 阅读 · 0 评论 -
【算法】单调队列 - 基础与应用-滑动窗口最大值
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。需要一个队列,在这个队列中放进窗口里的元素,然后随着窗口的移动,队列也一进一出,每次移动后,队列告诉我们里面的最大值是什么。保存队列中的元素单调递增或者单调递减,需要自己去实现这个单调队列。始终维护了一个单调的队列,从而每次很容易得取出当前窗口中得最大值。暴力:遍历一遍的过程中每次从窗口找到最大的数组,O(n * k)使用Deque自定义一个单调队列插入,弹出,获取一个元素。单调队列,即单调递减或单调递增的队列。原创 2024-06-23 23:58:59 · 336 阅读 · 0 评论 -
【算法】二叉树 - 理论基础
int val;原创 2024-06-23 22:33:26 · 1360 阅读 · 0 评论 -
leetcode.面试题 02.07. 链表相交
假a在链表A上移动,b在链表B上移动,a移动完在B上开始,b移动完再A上开始。最终a移动的距离a + c + x,b移动的距离 b + c + y。可以看到a + c + x = b + c + y,即a + x = b + y ,a移动b距离,b移动a距离a,b指针就会相交,直接返回a,b相交时候a/b指针所指节点的位置。即使a,b没有相交的地方,返回的也是null。给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。原创 2024-04-05 23:26:48 · 551 阅读 · 0 评论 -
leetcode.19. 删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。进阶:你能尝试使用一趟扫描实现吗?原创 2024-04-05 23:18:01 · 372 阅读 · 0 评论 -
leetcode.24. 两两交换链表中的节点
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。创建虚拟头节点,画图,确认步骤。原创 2024-04-05 23:12:38 · 270 阅读 · 0 评论 -
leetcode.206.反转链表
示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL。题意:反转一个单链表。原创 2024-04-05 23:06:05 · 501 阅读 · 0 评论 -
leetcode.707. 设计链表
addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。get(index):获取链表中第 index 个节点的值。addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。原创 2024-04-05 22:58:48 · 406 阅读 · 0 评论 -
leetcode.203. 移除链表元素
虚拟头节点dummy。创建一个虚拟的头节点指向原来的头节点,使得删除头节点的操作和删除其他节点的操作统一。要删除某个节点,需要将遍历指针指向要删除节点的前一个节点才可以。示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]示例 3: 输入:head = [7,7,7,7], val = 7 输出:[]示例 2: 输入:head = [], val = 1 输出:[]题意:删除链表中等于给定值 val 的所有节点。原创 2024-04-05 22:51:53 · 417 阅读 · 0 评论 -
leetcode.977. 有序数组的平方
由于数组是有序的,平方之后可能变换顺序的只有负数的情况,最大的数一定出现在两边,用双指针,指向两边,新建一个数组,比较两端的元素,从大到小补充新数组迭代元素,直到补充完成。解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]输入:nums = [-4,-1,0,3,10]输入:nums = [-7,-3,2,3,11]输出:[0,1,9,16,100]输出:[4,9,9,49,121]原创 2024-03-30 23:21:54 · 256 阅读 · 0 评论 -
leetcode:27. 移除元素
使用快慢指针法,快指针用来寻找新数组的元素,慢指针指向新数组的下标,比较快指针元素与目标值,当出现快指针与目标值不相等时,更新慢指针的值,同时向前。给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。因为数组是有序的,所以不能自己删除数组的方式,而且要使用覆盖的方式。元素的顺序可以改变。你不需要考虑数组中超出新长度后面。原创 2024-03-30 23:18:42 · 351 阅读 · 0 评论 -
codeTop:二叉树最大深度
属于二叉树遍历的变形,这里使用DFS的递归方式 最大深度就是 max(左子树最大深度 ,右子树最大深度) + 1, 而计算左/右子树最大深度可以用相同的算法。原创 2024-03-24 23:18:55 · 195 阅读 · 0 评论 -
codeTop102:二叉树的层序遍历
在已知BFS的方式后,知道每次从队列中取一个节点,就要将这个节点的所有子节点按照顺序放入队列。难点在于怎么确定将同一层的节点放在一个数组里面的输出,也就是输出一个二维数组?原创 2024-03-24 22:32:20 · 337 阅读 · 0 评论 -
树的遍历方式DFS和BFS
2、上图中一条路已经走到底了(9是叶子节点,再无可遍历的节点),此时就从 9 回退到上一个节点 5,看下节点 5 是否还有除 9 以外的节点,没有继续回退到 2,2 也没有除 5 以外的节点,回退到 1,1 有除 2 以外的节点 3,所以从节点 3 开始进行深度优先遍历,如下。1、我们从根节点 1 开始遍历,它相邻的节点有 2,3,4,先遍历节点 2,再遍历 2 的子节点 5,然后再遍历 5 的子节点 9。1.使用栈实现,对于每个节点,先遍历当前节点,然后吧右节点压栈,再压左节点。原创 2024-03-24 22:28:04 · 891 阅读 · 0 评论 -
codeTop01:LRU (最近最少使用) 缓存的实现
● void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value;在将某个节点移到链表头的时候,需要知道该节点的前一个节点和后一个节点,使前一个节点的尾指针指向后一个节点的头指针。● int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1。设计一个链表,链表的长度固定,将最近访问到的节点放在链表的头部,刚刚插入的节点也放在链表的头部。在初始化map和缓存容量的同时,新建头尾节点,方便后续的操作。原创 2024-03-04 23:28:08 · 485 阅读 · 0 评论