
Algorithm + DataStructure
一些基础算法以及数据结构知识、笔记
Luweir23
坚持自己所坚持,热爱自己所热爱;
努力的人运气都不会太差;
-
原创 一道把递归、链表、引用、双指针都结合的题——回文链表
题目描述:给出一个链表,然你判断它是不是回文链表,是则返回true,不是则返回false;比如1 2 3 5 3 2 1和1 2 3 5 5 3 2 1都是回文链表;限制条件:控制时间复杂度为O(n)、空间复杂度为O(1);解题思路:step1:判断是否为回文链表,必然要判断前半部分(顺序)和后半部分(反序)的元素是否全部一致;所以,我们首先要找到链表的中间结点;这里可能会想到先遍历一遍结点得到长度size,然后再从头遍历size/2的结点即可得到中间结点,这是普通的方法,需要遍历1.5次链表;而2020-10-15 14:07:0822
0
-
原创 Algorithm Set:floyd判环法
目录1.1 适用情况1.2 复杂度1.3 判断是否存在环1.4 找到环的入口1.5 代码实现1.1 适用情况该算法用于解决一个数组/链表中是否存在环的情况!1.2 复杂度时间复杂度:O(n)空间复杂度:O(1)1.3 判断是否存在环核心思想:类似于龟兔赛跑的原理,使用一个快指针和一个慢指针,快指针一次走两步,慢指针一次走一步,若数组/链表中存在环,那么快慢指针一定会在某一时刻指向同一个元素;fast指针走过的路程 Sfast=m+n1*k+cslow指针走过的路程 Sslow=m+n2*2020-09-25 14:06:4415
0
-
原创 Algorithm:多维数组和矩阵
目录T 1:顺时针打印二维数组T 2:将0所在的行列清零T 3:Z字形打印T 4:子数组的最大累加和T 5:矩阵的乘法矩阵的题目,一般逻辑较为清晰,但实行起来比较复杂,需要考虑周到,特别是越界问题;T 1:顺时针打印二维数组这个问题看起来很容易,逻辑清晰,但实现起来还是复杂些,要考虑到不能重复打印,超出边界;#include <iostream>#include <vector>using namespace std;void printMatrix(vector&2020-06-07 12:18:36100
0
-
原创 Algorithm:字典序最小问题
Describe:给一定长为N的字符串S,构造一个字符串T,长度也为N;对于空串T,反复进行下列任意操作1、从S的头部删除一个字符,加到T的尾部;2、从S的尾部删除一个字符,加到T的尾部;目标是生成的字符串T的字典序尽可能小;字符串S只包含大写英文字母Input:字符串SOutput:字符串TExample:Input: ACDBCBOutput:ABCBCDThinking:即每次只需比较两端,取较小字符,若两端字符相等,则继续向内比较,取较小一端的若干个字符;这里的一个技巧2020-06-07 09:08:5257
0
-
原创 Algorithm:递归思想及实例分析
目录递归思路T 1:求阶乘T 2:求数组元素和T 3:斐波那契数列T 4:最大公约数T 5:插入排序改递归T 6:汉诺塔问题T 7:二分查找的递归算法递归性能总结递归思路1、找重复:找出子问题2、找变化:变化的量应该作为参数;3、找边界:设计函数的出口;T 1:求阶乘输入n,使用递归的方法输出n!int Rec(int n){ if(n==1) return 1; return n*Rec(n-1);}T 2:求数组元素和对arr的所有元素求和int2020-06-05 23:06:2390
0
-
原创 Algorithm:贪心策略之区间覆盖问题
Describe:给定一个大区间1-T,以及n个小区间,要求用最少个数的小区间来覆盖大区间;Input:第一行,输入n和T;随后n行输入对应区间的起始终止坐标Output:输出覆盖区间1-T所需的最少区间个数Example:Input:3 101 73 66 12Output:2Thinking:首先应排除一些不可能用到的区间,比如右端点小于1和左端点大于T的区间;然后为满足贪心的思想,对于选择的第一个区间,必须使该区间的左端点<=1,右端点尽可能大;之后把此右端点2020-05-26 15:21:26135
0
-
原创 Algorithm:贪心策略之区间选点问题
Describe:在数轴上标点,使得该点能够被区间覆盖,并要求对应区间最少覆盖Ki个点,求最少标多少个点保证满足要求,同一个位置不能重复;Input:第一行输入区间个数 n后面n行输入对应区间的起始坐标,终点坐标以及需覆盖点的个数Output:最少所需点的个数Example:Input:53 7 38 10 36 8 11 3 110 11 1Output:6Thinking:首先依旧对所有区间按终点坐标进行排序,然后在终点坐标处进行打点,因为在这个位置打点能够被尽可能2020-05-26 14:02:17145
0
-
原创 Algorithm:贪心策略之区间选点问题
Describe:在数轴上标点,使得该点能够被区间覆盖,并要求对应区间最少覆盖Ki个点,求最少标多少个点保证满足要求,同一个位置不能重复;Input:第一行输入区间个数 n后面n行输入对应区间的起始坐标,终点坐标以及需覆盖点的个数Output:最少所需点的个数Example:Input:53 7 38 10 36 8 11 3 110 11 1Output:6Thinking:首先依旧对所有区间按终点坐标进行排序,然后在终点坐标处进行打点,因为在这个位置打点能够被尽可能2020-05-26 14:02:17145
0
-
原创 Algorithm:位运算的这些小技巧你知道吗?
目录位运算的巧妙之处应用二进制中1的个数异或运算的巧妙之处性质应用交换两个变量的值不用判断语句,求整数绝对值如何找唯一成对的数?位运算的巧妙之处算法中,位运算可以巧妙运用在一下几个方面:1、判断奇偶数 => x&12、判断数x中第k ( 从右至左 ) 位是1还是0 法1:( x >> ( k - 1 ) ) & 1 法2:x & ( 1 << ( k - 1 ) )3、交换两个整数变量 a , b 的值a = a ^ b;2020-05-21 09:37:58133
0
-
转载 数据结构:B树和B+树的插入、删除图文详解
目录B树1.1B树的定义1.2B树的插入操作1.3B树的删除操作B+树2.1 B+树的定义2.2 B+树的插入操作2.3 B+树的删除操作B树1.1B树的定义B树也称B-树,它是一颗多路平衡查找树。我们描述一颗B树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点,一般用字母m表示阶数。当m取2时,就是我们常见的二叉搜索树。一颗m阶的B树定义如下:1)每个结点最多有m-1个关键字。2)根结点最少可以只有1个关键字。3)非根结点至少有Math.ceil(m/2)-1个关键字。4)每个结2020-05-12 09:55:20383
0
-
原创 Algorithm:十大经典排序算法C++实现及总结
#include <iostream>#include <vector>#include <algorithm>using namespace std;//1、Bubble Sort 冒泡排序void bubbleSort(int a[], int length){ if (length < 2) return; for (int i = 0; i < length - 1; i++) //需length-1趟排.2020-05-10 13:48:571020
2
-
原创 Algorithm:贪心策略之区间调度问题
Describe:有n项工作,每项工作分别再si时间开始,在ti时间结束;对于每项工作,你都可以参与与否,如果选择参与,那么自始自终都必须全程参与;此外参加工作的时间段不能重复(即使是开始的瞬间和结束的瞬间的重叠也不允许);你的目标是参与尽可能多的工作,那么最多能参与多少项工作呢?1<=n<=1000001<=si<=ti<=10^9输入:第一行:n第二...2020-05-03 08:57:10108
0