- 博客(333)
- 收藏
- 关注
原创 算法详解/模版
把之前写过的一些对算法的理解放在这。Kmp算法AC自动机线段树详解主席树算法最小公共祖先LCA之TarjanDFS序讲解树状数组强连通分量最短路径之DijkstraDijkstra的堆优化最短路径之SPFA最短路径之Floyd当时困扰了我好久最小生成树之Kruskal最长上升子序列...
2021-03-23 13:38:27 158
原创 Dijkstra的堆优化
在寻找未访问过的最小的 d[u] 时, 未优化的dijkstra算法的寻找方法是遍历d数组, 而采用堆优化的dijkstra算法是创建一个优先队列, 每次取队首元素,即所要寻找的d[u], 时间复杂度比起未优化的要强太多。#include <iostream>#include <cstring>#include <queue>#include <...
2019-12-12 11:48:11 285
原创 树状数组讲解
树状数组能实现的功能线段树都能实现,所以之前是没打算仔细看它的。但今天做了一道题,,让我感受到了树状数组相对于线段树所具有的的优势。看下面三张图。第一张图unaccepted的都是用线段树写的出现了tle,第二张图是用线段树写的优化后ac的详细信息,第三张是用树状数组写的。仔细看看后两张图的第九第十组样例,,不难发现线段树太慢了(相对而言)。于是,,我还是研究研究树状数组吧。。逃上图是树状数...
2019-10-03 23:19:21 163
原创 线段树算法讲解
线段树算法讲解问:给你一个长度为n的数组,然后询问m次,每次询问是给定两个数x,y。求在【x,y】区间的数之和。也许你会说遍历,但若n为1e6,m为1e3呢?这是可以用一种数据结构——线段树。线段树的每一个点维护一个[l,r)的区间。长这样:图中,数组长度为6,第一个节点维护的是【1,6】的最大值,左节点维护的是【1,3】的最大值,以此类推,直至叶子节点。下面,以求区间和为例来进一步说明...
2019-09-05 19:21:23 646 1
原创 kmp算法详解
试想现在有这样一个问题,有一个文本串S,和一个模式串P,求P在S中的位置,需要怎么求呢?若用暴力的方法,时间复杂度为O(n*m),当字符串长度过大时显然不行。现在介绍另一种方法,可以将复杂度降到O(n)级别,这就是kmp。在讲解kmp之前,先介绍一下next数组,next数组可以说是kmp的精髓所在。1.next数组next数组里面的值的含义:1.代表当前字符之前字符中有多大长度的相同...
2019-08-25 22:28:26 308 3
原创 Windows下NC的使用
之前使用的是telnet,但感觉没nc好用, 就装了个nc试试。Windows下使用NC步骤:1.下载https://eternallybored.org/misc/netcat/杀软可能会报病毒,添加信任即可。2.设置环境变量在环境变量Path上添加NC的保存目录,就可以再cmd里直接使用nc命令了。...
2021-10-06 23:48:57 2955
原创 LeetCode 143. 重排链表 【模拟,链表】
给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例 1:给定链表 1->2->3->4, 重新排列为 1->4->2->3.示例 2:给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.两种写法。1.把链表转换为数组,根据数组重建链表。2.从中
2021-06-18 21:09:07 260
原创 LeetCode 109. 有序链表转换二叉搜索树 【递归】
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定的有序链表: [-10, -3, 0, 5, 9],一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -10 5把有序链表转换成二叉搜索树。有两种写法。1.把链表转换成数组,根据数组转化成二叉
2021-06-18 21:06:09 147
原创 LeetCode 92. 反转链表 II【模拟,链表】
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。示例 1:输入:head = [1,2,3,4,5], left = 2, right = 4输出:[1,4,3,2,5]示例 2:输入:head = [5], left = 1, right = 1输出:[5]提示:链表中节点数目为 n1 <= n <= 500-500 <= N
2021-06-18 20:58:25 100
原创 LeetCode 82. 删除排序链表中的重复元素 II【模拟,链表】
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。返回同样按升序排列的结果链表。示例 1:输入:head = [1,2,3,3,4,4,5]输出:[1,2,5]示例 2:输入:head = [1,1,1,2,3]输出:[2,3]提示:链表中节点数目在范围 [0, 300] 内-100 <= Node.val <= 100题目数据保证链表已经按升序排列在遍历的时候,跳过每个重复的节点
2021-06-18 20:52:05 136
原创 LeetCode 83. 删除排序链表中的重复元素【模拟】
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。返回同样按升序排列的结果链表。示例 1:输入:head = [1,1,2]输出:[1,2]示例 2:输入:head = [1,1,2,3,3]输出:[1,2,3]提示:链表中节点数目在范围 [0, 300] 内-100 <= Node.val <= 100题目数据保证链表已经按升序排列新建一个头指针,将其指向每一个不重复的节点就行。在遍历的时候,跳过重复的节点。
2021-06-18 20:47:02 85
原创 LeetCode61. 旋转链表【模拟】
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。示例 1:输入:head = [1,2,3,4,5], k = 2输出:[4,5,1,2,3]示例 2:输入:head = [0,1,2], k = 4输出:[2,0,1]提示:链表中节点的数目在范围 [0, 500] 内-100 <= Node.val <= 1000 <= k <= 2 * 109因为是链表,向右移动k位,相当于最后k个节点到了链表的最前面。更新下就行。我是定义了
2021-06-16 20:05:57 128 4
原创 LeetCode24. 两两交换链表中的节点 【递归,模拟】
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例 1:输入:head = [1,2,3,4]输出:[2,1,4,3]示例 2:输入:head = []输出:[]示例 3:输入:head = [1]输出:[1]提示:链表中节点的数目在范围 [0, 100] 内0 <= Node.val <= 100进阶:你能在不修改链表节点值的情况下解决这个问题吗?(也就是说,仅修改节点本身。)三种写法。1
2021-06-16 18:25:21 105
原创 LeetCode 链表求和【模拟】
给定两个用链表表示的整数,每个节点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。示例:输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295输出:2 -> 1 -> 9,即912进阶:思考一下,假设这些数位是正向存放的,又该如何解决呢?示例:输入:(6 -> 1 -> 7) + (2 -> 9 -> 5),即617 + 295输出:9 -
2021-06-16 18:15:32 97
原创 LeetCode 回文链表【递归,快慢指针】
编写一个函数,检查输入的链表是否是回文的。示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?三种写法。1.把链表中的数据放到数组里求解。(这种写法不放代码了)2.递归求解。定一个指向链表起始节点的指针,然后递归遍历链表。在遍历到最后一个节点的时候和起始指针的值尽心比较。然后令指针指向下一位,返回函数返回上一层。但函数在进行调用的时候会开辟出栈帧
2021-06-16 18:12:27 138
原创 LeetCode 移除重复节点
编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。示例1:输入:[1, 2, 3, 3, 2, 1]输出:[1, 2, 3]示例2:输入:[1, 1, 1, 1, 2]输出:[1, 2]提示:链表长度在[0, 20000]范围内。链表元素在[0, 20000]范围内。进阶:如果不得使用临时缓冲区,该怎么解决?两种写法。1.标记已经遍历的节点。2.遍历节点的同时再开一个循环,移除后续已经重复的节点。/** * Definition for singly-linked l
2021-06-16 18:03:48 96
原创 LeetCode 分割链表
编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的节点之前。如果链表中包含 x,x 只需出现在小于 x 的元素之后(如下所示)。分割元素 x 只需处于“右半部分”即可,其不需要被置于左右两部分之间。示例:输入: head = 3->5->8->5->10->2->1, x = 5输出: 3->1->2->10->5->5->8额外定义两个指针,分别存小于和大于等于的链表。/** * Defini
2021-06-14 20:31:05 231
原创 LeetCode 两个链表的第一个公共节点【思维】
输入两个链表,找出它们的第一个公共节点。输入: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输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B
2021-06-14 20:29:14 80
原创 LeetCode 返回倒数第 k 个节点【双指针】
实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。注意:本题相对原题稍作改动示例:输入: 1->2->3->4->5 和 k = 2输出: 4说明:给定的 k 保证是有效的。双指针,很妙的一种写法。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val
2021-06-14 20:25:34 114
原创 Java后端自学路线分享
若你在读cs,但感到迷茫或者说你正在准备春招秋招,希望这篇博客会对你有所帮助。背景双非本科在读,有ACM经历,目前拿了阿里巴巴,字节跳动,腾讯区域研发中心和京东的offer。我从寒假开始准备春招。寒假的前一半时间在刷题,确定就业还是考研,后一半时间开始系统学java。在这里,特别感觉陈学长,他给了我一个具体的学习路线和学习资源,也让我走了不少弯路。想要内推字节的朋友可以联系这位学长。就业还是考研这个,因人而异。我比较喜欢搞开发,对人工智能没有太大的兴趣。若是搞后端,个人觉得在工作中能够学的更多。
2021-06-01 18:06:58 496 4
原创 RedisDesktopManager连接阿里云Redis
需要在redis配置文件上修改一些内容。我的redis配置文件在/usr/local/bin/myconfig/目录下,名称为redis.conf。下面描述的时候称其为conf.1.将conf文件中的 requirepass值的取消注释 并修改设置你的redis密码2,将conf文件中的 bind 127.0.0.1 这个值注释掉3.开放阿里云6379端口但是完成上述步骤后RedisDesktopManager提示连接失败。最后发现是宝塔Linux面板的问题。之前安装了宝塔面板,在面板上再次打
2021-05-27 20:28:13 310
原创 LeetCode 334. 递增的三元子序列【思维】
博客开始更新。给你一个整数数组 nums ,判断这个数组中是否存在长度为 3 的递增子序列。如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k ,使得 nums[i] < nums[j] < nums[k] ,返回 true ;否则,返回 false 。示例 1:输入:nums = [1,2,3,4,5]输出:true解释:任何 i < j < k 的三元组都满足题意示例 2:输入:nums = [5,4,3,2,1]输出:fals
2021-05-19 09:21:20 237 4
原创 快速乘法
和快速幂类似。思想是把乘法转换成加法。详见代码。#include <iostream>using namespace std;int multi(int a, int b) { int res = 0;//最终值 while(b) { if(b & 1) res += a;//若当前位为1,就相加 a <<= 1;//扩大二倍 b >>= 1;//右移一位 } return res;} int main() { int
2021-04-12 23:37:52 131
原创 JAVA GC机制
java的垃圾回收绝大多数发生在堆上。堆可分为新生代和老年代。新生代又分为三个区:伊甸区,幸存0区和幸存1区,即(Eden,Survivor0和Survivor1)。GC算法1.标记清除算法标记清楚算法会为每个对象设置一个标记位,其分为两个阶段。第一个阶段会检查对象是否死亡,并更新标记。第二个阶段会清除死亡的对象。缺点:清除过后会产生碎片,并且扫描两次,浪费时间。2.标记压缩算法这个算法是标记清除算法的改进版。其分为三个阶段。第一个阶段检查对象是否死亡,并对其进行标记。第二个阶段会清楚死亡的
2021-02-23 16:36:39 84
原创 LeetCode 1052. 爱生气的书店老板【滑动窗口】
今天,书店老板有一家店打算试营业 customers.length 分钟。每分钟都有一些顾客(customers[i])会进入书店,所有这些顾客都会在那一分钟结束后离开。在某些时候,书店老板会生气。 如果书店老板在第 i 分钟生气,那么 grumpy[i] = 1,否则 grumpy[i] = 0。 当书店老板生气时,那一分钟的顾客就会不满意,不生气则他们是满意的。书店老板知道一个秘密技巧,能抑制自己的情绪,可以让自己连续 X 分钟不生气,但却只能使用一次。请你返回这一天营业下来,最多有多少客户能够感
2021-02-23 05:43:17 198
原创 LeetCode 766. 托普利茨矩阵 【模拟】
给你一个 m x n 的矩阵 matrix 。如果这个矩阵是托普利茨矩阵,返回 true ;否则,返回 false 。如果矩阵上每一条由左上到右下的对角线上的元素都相同,那么这个矩阵是 托普利茨矩阵 。示例 1:输入:matrix = [[1,2,3,4],[5,1,2,3],[9,5,1,2]]输出:true解释:在上述矩阵中, 其对角线为:“[9]”, “[5, 5]”, “[1, 1, 1]”, “[2, 2, 2]”, “[3, 3]”, “[4]”。各条对角线上的所有元素均相同,
2021-02-23 05:41:49 157
原创 JVM 双亲委派机制
java中有三种加载器。分别为:BootstrapClassLoader:主要负责加载核心的类库(java.lang.*等)ExtClassLoader:主要负责加载jre/lib/ext目录下的一些扩展的jar。AppClassLoader:主要负责加载应用程序的主函数类当需要加载一个类如Person.class类时,会先判断是否在AppClassLoader里面加载过。若已加载则无需加载,否则在其父类加载器也就是ExtClassLoader里面判断是否加载过,若没有就进入BootstrapCl
2021-02-22 22:19:30 85
原创 LeetCode 1438. 绝对差不超过限制的最长连续子数组【STL】
给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 。如果不存在满足条件的子数组,则返回 0 。示例 1:输入:nums = [8,2,4,7], limit = 4输出:2解释:所有子数组如下:[8] 最大绝对差 |8-8| = 0 <= 4.[8,2] 最大绝对差 |8-2| = 6 > 4.[8,2,4] 最大绝对差 |8-2| = 6 > 4.[8,2,4,
2021-02-22 00:02:20 104
原创 LeetCode 78. 子集【状态压缩】
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。示例 1:输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例 2:输入:nums = [0]输出:[[],[0]]提示:1 <= nums.length <= 10-10 <= nums[i] <= 10nums 中的所有元素 互不相同
2021-02-22 00:00:09 95
原创 LeetCode 89. 格雷编码 【找规律】
格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。即使有多个不同答案,你也只需要返回其中一种。格雷编码序列必须以 0 开头。示例 1:输入: 2输出: [0,1,3,2]解释:00 - 001 - 111 - 310 - 2对于给定的 n,其格雷编码序列并不唯一。例如,[0,2,3,1] 也是一个有效的格雷编码序列。00 - 010 - 211 - 301 - 1示例 2:输入: 0输出
2021-02-21 23:57:57 189
原创 LeetCode 16. 最接近的三数之和【双指针】
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。示例:输入:nums = [-1,2,1,-4], target = 1输出:2解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。提示:3 <= nums.length <= 10^3-10^3 <= nums[i] <= 10^3-10^4 <= t
2021-02-21 23:56:25 115
原创 LeetCode 43. 字符串相乘【高精度】
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。示例 1:输入: num1 = “2”, num2 = “3”输出: “6”示例 2:输入: num1 = “123”, num2 = “456”输出: “56088”说明:num1 和 num2 的长度小于110。num1 和 num2 只包含数字 0-9。num1 和 num2 均不以零开头,除非是数字 0 本身。不能使用任何标准库的大数类型(比如 Big
2021-02-21 23:54:27 87
原创 C++ multiset
multiset与set的区别是multiset能保存重复的元素,而set不能。插入和删除操作的时间复杂度为nlogn。常用操作:c.begin()返回一个随机存取迭代器,指向第一个元素c.end()返回一个随机存取迭代器,指向最后一个元素的下一个位置c.rbegin()返回一个逆向迭代器,指向逆向迭代的第一个元素c.rend()返回一个逆向迭代器,指向逆向迭代的最后一个元素的下一个位置...
2021-02-21 23:52:30 319
原创 Java Collections.copy()的注意事项
Collections.copy(dest, src)的作用是将src的内容复制到dest中。但是下面的代码会报错:public class CollectionsTest { public static void main(String[] args) { List src = new ArrayList(); src.add(234); src.add("asdf"); List dest = new ArrayList();
2021-02-17 00:14:38 258
原创 路由桥接后副路由频繁断网的解决办法及完整的桥接过程
前两天桥接了一个路由器,可是频繁断网。找原因时发现每次断网时ipv4的DNS服务器地址是192.168.3.2。而网络正常的时候DNS服务器的地址是192.168.3.1。原因就在这里,在副路由管理页面设置DHCP服务器的时候可以设置DNS服务器地址。设置完成之后断网很少了。网上很多桥接路由器的教程都是副路由关闭DHCP服务器,但是关了后会导致断网频繁和无法连接等问题。下面说说桥接路由器的具体过程。1.更改副路由的IP地址。若主路由的IP地址为192.168.3.1,副路由可以更改为192.168.
2021-02-01 19:46:08 33450 4
原创 LeetCode 22. 括号生成 【DFS】
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例 1:输入:n = 3输出:["((()))","(()())","(())()","()(())","()()()"]示例 2:输入:n = 1输出:["()"]提示:1 <= n <= 8先放左括号,再放右括号。class Solution {public: void dfs(int l, int r, int n, string str, vector<s
2021-02-01 18:06:18 69
原创 LeetCode 39. 组合总和 【DFS】
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。 示例 1:输入:candidates = [2,3,6,7], target = 7,所求解集为:[[7],[2,2,3]]示例 2:输入:candidates = [2,3,5], target = 8,
2021-02-01 18:05:07 76
原创 LeetCode 48. 旋转图像 【模拟】
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[[7,4,1],[8,5,2],[9,6,3]]示例 2:输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]输出:[[15,13,2,5],[1
2021-02-01 18:03:20 84
原创 LeetCode 238. 除自身以外数组的乘积 【思维】
给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。示例:输入: [1,2,3,4]输出: [24,12,8,6]提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。进阶:你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不
2021-01-31 22:19:34 86
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人