算法刷题
潇湘夜雨~
不积跬步,无以至千里
展开
-
LRU算法(C++实现)
一、LRU算法简介对于web开发而言,缓存必不可少,也是提高性能最常用的方式。无论是浏览器缓存,还是服务端的缓存(通过memcached或者redis等内存数据库)。缓存不仅可以加速用户的访问,同时也可以降低服务器的负载和压力。那么,了解常见的缓存淘汰算法的策略和原理就显得特别重要。常见的缓存算法LRU (Least recently used) 最近最少使用,如果数据最近被访问过,那...原创 2020-03-29 17:36:01 · 11112 阅读 · 6 评论 -
LeetCode 112. 路径总和(C++实现)
一、题目描述给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。说明:叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 1...原创 2020-02-28 13:25:40 · 199 阅读 · 0 评论 -
LeetCode 101. 对称二叉树(C++实现)
一、题目描述给定一个二叉树,检查它是否是镜像对称的。例如,二叉树[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说明:如果你可以运用...原创 2020-02-27 16:38:32 · 271 阅读 · 0 评论 -
LeetCode 104. 二叉树的最大深度(C++实现)
一、题目描述给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明:叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最大深度3 。二、思路一般来说,树的遍历分为两种策略:DFS...原创 2020-02-27 14:13:37 · 1146 阅读 · 0 评论 -
LeetCode 102. 二叉树的层次遍历(C++实现)
一、题目描述给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。例如:给定二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层次遍历结果:[ [3], [9,20], [15,7]]二、思路层次遍历,整个遍历过程只经过...原创 2020-02-25 14:02:47 · 287 阅读 · 0 评论 -
LeetCode 144. 二叉树的前序遍历 (C++实现)
一、题目描述给定一个二叉树,返回它的前序遍历。示例:输入: [1,null,2,3] 1 \ 2 / 3输出: [1,2,3]进阶:递归算法很简单,你可以通过迭代算法完成吗?二、思路方法一:迭代从根节点开始,每次迭代弹出当前栈顶元素,并将其孩子节点压入栈中,先压右孩子再压左孩子。方法二:...原创 2020-02-24 10:24:11 · 669 阅读 · 0 评论 -
LeetCode 61. 旋转链表(C++实现)
一、题目描述给定一个链表,旋转链表,将链表每个节点向右移动k个位置,其中k是非负数。示例1:输入: 1->2->3->4->5->NULL, k = 2输出: 4->5->1->2->3->NULL解释:向右旋转 1 步: 5->1->2->3->4->NULL向右旋转 2 步...原创 2020-02-23 21:27:01 · 306 阅读 · 0 评论 -
LeetCode 2. 两数相加(C++实现)
一、题目描述给出两个非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -...原创 2020-02-23 19:24:50 · 1149 阅读 · 0 评论 -
LeetCode 21. 合并两个有序链表(C++实现)
一、题目描述将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4二、思路我们的目的是将两个有序链表合并成一个有序链表,因此,我们的每次操作都是获取 l1l1 指向的结点和 l2l2 指向的结...原创 2020-02-23 14:02:28 · 197 阅读 · 0 评论 -
LeetCode 234.回文链表(C++实现)
一、题目描述请判断一个链表是否为回文链表。示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true进阶:你能否用O(n) 时间复杂度和 O(1) 空间复杂度解决此题?二、思路方法一:将值复制到数组中后用双指针法确定数组列表是否为回文很简单,我们可以使用双指针法来比较两端...原创 2020-02-18 22:08:10 · 309 阅读 · 0 评论 -
LeetCode 328. 奇偶链表 (C++实现)
一、题目描述给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。示例 1:输入: 1->2->3->4->5->NULL输出: 1->3-&g...原创 2020-02-17 10:15:36 · 351 阅读 · 0 评论 -
LeetCode 203.移除链表元素 (C++实现)
一、题目描述删除链表中等于给定值val的所有节点。示例:输入: 1->2->6->3->4->5->6, val = 6输出: 1->2->3->4->5二、思路如果删除的节点是中间的节点,则问题非常简单,也是利用双指针的技巧。快指针先走一步用于去寻找删除链表中等于给定值val的所有节点;慢指针落后...原创 2020-02-15 19:21:17 · 367 阅读 · 0 评论 -
LeetCode 19. 删除链表的倒数第N个节点 (C++实现)
一、题目描述给定一个链表,删除链表的倒数第n个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.说明:给定的n保证是有效的。进阶:你能尝试使用一趟扫描实现吗?二、思路方法一:两次遍历算法...原创 2020-02-14 19:48:22 · 429 阅读 · 0 评论 -
LeetCode 160. 相交链表 (C++实现)
一、题目描述编写一个程序,找到两个单链表相交的起始节点。如下面的两个链表:在节点 c1 开始相交。示例 1:输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3输出:Reference of the node with value = 8输入解释:...原创 2020-02-14 16:37:37 · 566 阅读 · 0 评论 -
LeetCode 142. 环形链表 II(C++实现)
一、题目描述给定一个链表,返回链表开始入环的第一个节点。如果链表无环,则返回null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。说明:不允许修改给定的链表。示例 1:输入:head = [3,2,0,-4], pos = 1输出:tail connects to nod...原创 2020-02-13 21:05:57 · 244 阅读 · 0 评论 -
LeetCode 141. 环形链表 (C++实现)
一、题目描述给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。示例 1:输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一个环,其尾部连接到第二个节点。示例2:输入:head = [1,2...原创 2020-02-13 13:41:53 · 396 阅读 · 0 评论 -
LeetCode 707. 设计链表 (C++实现)
一、题目描述设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val和next。val是当前节点的值,next是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性prev以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。在链表类中实现这些功能:get(index):获取链表中第index个节点的值。如果索引...原创 2020-02-13 10:16:21 · 853 阅读 · 0 评论 -
LeetCode 206. 反转链表(C++实现)
一、题目描述反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题?二、迭代法核心思想:设立三个指针,依次完成反转,在反转之前需要存储下一个结点的地址,否则后面的结点会丢失。h...原创 2020-02-05 22:21:05 · 656 阅读 · 1 评论 -
剑指offer--面试题41:数据流中的中位数
题目 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。思路采用大根堆+小根堆结合的方法,且满足: ① 两个堆中的数据数目差不能超过1,这样可以使中位数只会出现在两个堆的交接处; ...原创 2019-11-20 17:01:39 · 115 阅读 · 0 评论 -
谈谈尾递归
要说尾递归先理解尾调用尾调用定义来自尾调用维基百科在计算机学里,尾调用是指一个函数里的最后一个动作是返回一个函数的调用结果的情形,即最后一步新调用的返回值直接被当前函数的返回结果代码形式上表现为一个函数执行的最后是调用另一个函数//仅举例,没有使用特定语言的语法function f(x) { a(x); b(x); return g(x); ...原创 2019-09-02 11:26:10 · 95 阅读 · 0 评论 -
LeetCode 17. 电话号码的字母组合(C++)
题目描述:给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例:输入:"23"输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].说明:尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。...原创 2019-08-22 17:11:55 · 350 阅读 · 0 评论