算法
xin_hen
这个作者很懒,什么都没留下…
展开
-
最大回文子串(中心点扩展与Manacher算法)
最大回文子串问题描述中心点扩展算法思想源码Manacher算法思想源码问题描述给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: “babad”输出: “bab”注意: “aba” 也是一个有效答案。示例 2:输入: “cbbd”输出: “bb”题目来源:5. 最长回文子串 - 力扣(LeetCode)中心点扩展算法思想选择一个中心点,向两边扩展,直至不符合回文串要求;时间复杂度:O(n2);空间复杂度:O(1);源码原创 2020-08-29 20:58:01 · 394 阅读 · 0 评论 -
排序算法——冒泡排序
描述基本思想:循环地利用比较交换的操作,将第i大的元素归位;平均时间复杂度:O(n2),最好时间复杂度:O(n),最坏时间复杂度:O(n2);空间复杂度:O(1)源码//冒泡排序void BubbleSort(vector<int>& nums) { for (int i = nums.size()-1; i >= 0;--i) { bool flag = true; for (int j = 0; j < i; ++j) { if (nums原创 2020-08-28 20:00:35 · 151 阅读 · 0 评论 -
排序算法——归并排序(递归与非递归)
描述基本思想:将已有序的子序列合并,得到完全有序的序列;一种常见的方法是将数据等分为二份,分别进行递归排序,之后对这两组有序的数据再进行一次排序即可;基于递归的归并排序比较简单,只需要自上而下进行排序即可;而非递归版本的归并排序则需要自下而上进行排序;时间复杂度:O(nlogn),空间复杂度:O(n);归并排序为稳定排序算法;此外,归并排序可用于求解逆序对;源码#pragma once#include<vector>#include<algorithm>cl原创 2020-08-28 19:57:10 · 1318 阅读 · 0 评论 -
二叉树遍历的三种实现方式
二叉树遍历的三种实现方式中序遍历基于递归实现非递归实现之stack非递归实现之线索树先序遍历基于递归实现非递归实现之stack非递归实现之线索树后序遍历基于递归实现非递归实现之stack非递归实现之线索树中序遍历基于递归实现 //递归版本中序遍历(左 中 右) void inorderTraversal1(TreeNode* tree,std::vector<int>& vec) { if (tree == NULL) return; inorderTraversal1(原创 2020-08-27 14:05:42 · 461 阅读 · 0 评论 -
排序算法——快排系列2(C++)
描述1)基于递归的排序容易造成栈溢出,因此这里提供一种快排的非递归版本;2)由于使用到了stack数据结构以存储需要快排的数据段,因此也存在内存溢出的风险;3)如果希望避免内存溢出,可以考虑混合式排序,即在STL中的sort函数,是一种混合排序(自省式排序)——如果递归深度过深,采用堆排序;如果当前排序元素过少,则使用插入排序(插入排序在数组相对有序的情况下,性能比快排好);否则是使用三数取中快排;源码 //三数取中,将中值放在first上 void swapThreeMedian(int&a原创 2020-08-27 13:23:15 · 130 阅读 · 0 评论 -
C++寻找两个链表的交点
算法思想链表明确无环下 findIntersectWithoutRing这种情况,只需要使用两个指针进行一次遍历就可以了。注:可以假想成两个链表彼此相连,即list2连到list1后面,list1连在list2后面;链表可能有环 findIntersect首先需要判断两个链表是否有环,环的入口,以及不重复节点的数量;当两个链表其中一个无环,另一个有环时,必然没有交点;当两个链表都有环,且环的入口不一致时,需要判断是否为同一个环;如果是同一个环,则返回其中一个环入口,否则,必然没有交点;其它原创 2020-08-16 14:25:32 · 497 阅读 · 0 评论 -
最大公约数与最小公倍数
#pragma once#include<algorithm>using namespace std;//求最大公约数//辗转相除法int GCD(int n, int m) { if (n < m) swap(n, m); while (m != 0) { int tmp = n % m; n = m; m = tmp; } return n;}//求最小公倍数int LCM(int n, int m) { return n * m / GCD(n,原创 2020-08-16 12:46:53 · 174 阅读 · 0 评论 -
排序算法——桶排序、计数排序与基数排序(C++)
桶排序基本思想先扫描得到待排序数组中的最大值maxVal与最小值minVal,假设桶的个数为k,则代表则将[minVal, maxVal]均分为k个范围,每个范围中的元素各自放入对应的桶中。如此桶之间必然是有序的,桶内使用排序算法进行排序,最后按序收集所有桶的元素,即完成桶排序;复杂度时间复杂度总的时间复杂度为 O(n)+O(k)O(n/klog(n/k)) = O(n+nlog(n/k))当 k 接近于 n 时,桶排序的时间复杂度就可以金斯认为是 O(n) 的。即桶越多,时间效率就越高,而桶原创 2020-08-16 10:12:36 · 1015 阅读 · 0 评论 -
排序算法——插入排序与希尔排序(C++)
插入排序基本思想插入排序插入排序的基本思想是:将一个待排数据插入到已经排序的数据中的适当位置,如果迭代。希尔排序希尔排序(Shell Sort)又称为“缩小增量排序”。该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的。复杂度插入排序平均时间复杂度:O(n2),原创 2020-08-15 12:29:23 · 181 阅读 · 0 评论 -
C++实现大数加法和乘法
#pragma once#include<iostream>#include<vector>#include<assert.h>#include<algorithm>using namespace std;class BigNumber {private: //判断是否为数字 bool isNumber(const string& number) { int index = 0; if (number[index] == '-原创 2020-08-13 20:25:21 · 487 阅读 · 0 评论 -
最小生成树MST
最小生成树MST最小生成树是在一张无向连通图中,找到一棵树,使得其边的代价之和最小。注:可能存在多个最小生成树。两种算法Kruskal核心思想以边为展开,将图中的最小代价边尝试加入集合tree中,并且该边不能与集合tree中的边形成环,如此迭代,最终得到的集合tree为MST。因此可以采用并集查的方式实现Kruskal算法Prim核心思想以点为展开,将图中的最小代价边的终点尝试加入集合visited中,并边的起点from已在集合visited中,终点to不在集合visited中。这里,可以采用原创 2020-08-12 10:14:03 · 215 阅读 · 0 评论 -
质数判断的两种方式
#include<math.h>using namespace std;//简单方法,质数无法被1和自身以外的数整除bool isPrime1(int n) { if (n < 2) return true; int sn = sqrt(n); for (int i = 2; i <= sn; ++i) if (n % i == 0) return false; return true;}//...,6x-1,6x+1,6x+2,6x+3,6x+4,6x+5原创 2020-08-04 21:30:16 · 1180 阅读 · 0 评论 -
LRU与LFU缓存替换算法C++实现
LRU与LFU缓存替换算法C++实现LRU实现实现原理讨论源码LRU实现实现原理源码Dqueue版本list版本LRU实现实现原理数据结构unordered_map+Dqueue;unordered_map的键为key,值为Node*,方便快速存取数据;Dqueue双端队列,快速删除、插入Node*;讨论简单的LRU是存在缺点的,比如有某一次缓存操作是完全随机的,但是LRU缓存中替换为了这一次随机的访问数据(指的是,只有这一次被访问,接下来不会被访问),导致缓存被污染;因此也有对LRU的原创 2020-08-04 19:34:42 · 427 阅读 · 0 评论 -
排序算法——快排系列1(C++)
描述1)这里只实现了三数取中快排quickSort;时间复杂度为O(nlogn)2)在STL中的sort函数,是一种混合排序(自省式排序)——如果递归深度过深,采用堆排序;如果当前排序元素过少,则使用插入排序(插入排序在数组相对有序的情况下,性能比快排好);否则是使用三数取中快排;3)基于快排思想,快速选择第rank个最小的元素quickSelect;时间复杂度为O(n);源码#pragma once#include<vector>class QuickSort {priva原创 2020-08-02 13:18:47 · 192 阅读 · 0 评论 -
C++实现最大堆
#pragma once#include<vector>#include<assert.h>//最大堆template<typename T>class Heap {public: Heap(int size=0):data(size){} bool isEmpty() { return last == 0; } void push(int val) { if (data.size() <= last) data.push_b原创 2020-08-02 12:04:06 · 338 阅读 · 0 评论 -
排序算法——堆排序(C++)
#pragma once#include<vector>//调整堆void maxHeapify(std::vector<int>& nums, int cur, int size) { while ((2 * cur + 1) < size) { int left = 2 * cur + 1; int right = 2 * cur + 2; int larger = left; if (right<size && nu原创 2020-08-02 12:05:36 · 106 阅读 · 0 评论 -
C++实现KMP算法
#pragma once#include<vector>#include<string>class KMP {private: std::vector<int> getNext(const std::string& p) { if (p.size() < 1) return {}; std::vector<int>next(p.length()); next[0] = -1; int i = 0, k = -1;原创 2020-08-02 12:52:26 · 154 阅读 · 0 评论