08 2020 档案
摘要:1 题目描述 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱
阅读全文
摘要:1 题目描述 假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?例如,一只股票在某些时间节点的价格为{9,11,8,5,7,12,16,14}。如果我们在价格为5的时候买入,在价格为16的时候卖出,则能收获最大的利润11。 2 输入 数组,代表股票一段时间的
阅读全文
摘要:1 题目描述 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子
阅读全文
摘要:Java中有许多设计模式,总体分为3大类:创建型模式、结构型模式和行为型模式。 分类 设计模式 关注点 创建型模式 工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式 关注于对象的创建,同时隐藏创建逻辑 结构性模式 适配器模式、过滤器模式、装饰模式、享元模式、代理模式、外观模式、组合模式、桥接模
阅读全文
摘要:1 重写(Override) 从字面上看,重写就是 重新写一遍的意思。其实就是在子类中把父类本身有的方法重新写一遍。子类继承了父类原有的方法,但有时子类并不想原封不动的继承父类中的某个方法,所以在方法名,参数列表,返回类型(除非子类中方法的返回值是父类中方法返回值的子类时)都相同的情况下, 对方法体
阅读全文
摘要:可以很轻松地想到用回溯法进行暴力枚举,但复杂度很高O(6^n),肯定会超时,所以可以类比为斐波那契数列的形式:。采用类似动态规划的方法(其实和斐波那契一样,并不严格是动态规划)。 回溯法暴力枚举C
阅读全文
摘要:即求队列的最大值 #include <queue> class Solution { public: vector<int> maxInWindows(const vector<int>& num, unsigned int size){ vector<int> maxInWind; if(num.
阅读全文
摘要:快慢指针(主要解决链表中的问题) 链表中是否包括环,进而求链表中环的入口节点 链表的中间节点(重要作用就是对链表进行归并排序) 链表的倒数第k个节点 等等 左右指针(主要解决数组(或者字符串)中的问题) 二分查找 求排序树组中和为sum的两个数 反转数组(字符串) 滑动窗口(双指针技巧的最高境界)
阅读全文
摘要:二分算法的前提是排序数组,通过折半查找的方式,将找到目标值的时间复杂度缩小到O(logn) 最主要的3个问题 查找某元素即返回索引 查找某元素的左边界索引 查找某元素的右边界索引 二分算法框架: // 查找某元素即返回索引 int binarySearch(int num[], int length
阅读全文
摘要:BFS算法框架 BFS的核心思想,就是把一些问题抽象成图,从一个节点开始,向四周扩散。一般来说,写BFS都是用[队列]这个数据结构,每次将一个节点周围的节点加入到队尾。 BFS相对于DFS的最主要区别是:BFS找到的路径一定是最短的,但代价就是空间复杂度比DFS大很多。本文从两道经典的BFS题目来讲
阅读全文
摘要:1 题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 2 输入 str 3 输出 str的全排列(可能有字符重复)。字符只包括大小写字母。 4 样例输入 "
阅读全文
摘要:斐波那契数列的例子严格来说不算动态规划,以上旨在演示算法设计螺旋上升的过程。当问题中要求求一个最优解或在代码中看到循环和 max、min 等函数时,十有八九,需要动态规划大显身手。 动态规划遵循一套固定的流程:递归的暴力解法 → 带备忘录的递归解法(剪支) → 非递归的动态规划解法。这个过程是层层递
阅读全文
摘要:1 题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定
阅读全文
摘要:1 题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am
阅读全文
摘要:1 题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也
阅读全文
摘要:1 题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 2 输入 num[], S 3 输出 输出两个数,小的先输出。 4 样例输入 1,2,3,5,7,10,11,15 5 样例输出 4,11 6 求解思路 双
阅读全文
摘要:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 解题思路 加入一个辅助HashMap 位运算之异或的特点(很妙) 上代码(C++很香) 法一:加入HashMap public void FindNumsAppearOnce(int[] array, in
阅读全文
摘要:输入一棵二叉树,判断该二叉树是否是平衡二叉树。 在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树 解题思路 根据上一个题目“求二叉树的深度”,遍历每一个节点的左右子树深度 通过“后序遍历”的特点,每个节点只需要遍历一次 上代码(C++很香) 法一:根据上一个题目“求二叉树的深度”,遍历每
阅读全文
摘要:统计一个数字在升序数组中出现的次数。 解题思路 中序遍历递归查找到第k个 还可以通过非递归的中序遍历法找到第k个 上代码(C++很香) 法一:递归中序遍历 TreeNode* ans = nullptr; int countK = 0; // 中序遍历 void middleDFS(TreeNode
阅读全文
摘要:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 解题思路 回溯法 上代码(C++很香) 回溯法,每次可以向左和向右走,最后统计最大的深度 int maxD = 0; void dfs(TreeNode* pNode, int
阅读全文
摘要:统计一个数字在升序数组中出现的次数。 解题思路 二分查找+顺序遍历(O(n)) 二分查找变体 上代码(C++很香) 法二:二分查找变体 首先,排序数组的查找,应该最先想到二分查找,能做到O(logn)的复杂度优势。然后,统计出现次数,如果用遍历前后的数量的方式,可能会达到O(n)的复杂度,所以,结合
阅读全文
摘要:输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的) 解题思路 暴力枚举(O(m*n)) 辅助栈(两个栈) 双指针(O(m+n)) 上代码(C++很香) 法一:暴力枚举 ListNode* FindFirstCommonN
阅读全文
摘要:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007 解题思路 暴力枚举(O(n2),对于105的数组长度,显然会超时) 分治思想 上代码(C++很香
阅读全文
摘要:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。 解题思路 空间换时间,用一个HashMap来保存每个字符出现的次数 上代码(Java很
阅读全文
摘要:在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数) 解题思路 空间换时间,用一个HashMap来保存每个字符出现的次数 相关题目 输入两个字符串,从第一个字符串中删除在第二个字符串中出
阅读全文
摘要:把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。 解题思路 暴力枚举法(会超时,一般的C++程序运行10^9次就会超过1s而超时) 空间换时间,保存已计算的丑数,并通
阅读全文
摘要:请从字符串中找出一个最长的不包含重复字符的连续子字符串,计算该最长连续子字符串长度。假设字符串只包含'a'~'z'的字符。例如在字符串"arabcacfr"中,最长连续子字符串为"acfr",长度为4。 解题思路 这是一道基础的动态规划题,首先应该能想到用暴力法解决,然后再考虑是否能用动态规划来优化
阅读全文
摘要:在一个m x n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格,直到到达棋盘的右下角。请问你最多能拿到多少价值的礼物? 解题思路 这是一道基础的动态规划题,首先应该能想到用回溯法求解,然后再考虑是否能用动态规划来
阅读全文
摘要:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。 解题思路 有4种情况: 该节点有右子树 该节点没有右子树,且是根节点 如果该节点没有右子树,且是左子节点 该节点没有右子树,且是右子节点 上代码(C++香) str
阅读全文
摘要:给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成“a”,1翻译成“b”,……,25翻译成“z”。一个数字可能有多种翻译。例如,12258有5种不同的翻译,分别是“bccfi”、“bwfi”、“bczi”、“mcfi”、“mzi”。求一个数字有多少种不同的翻译方法? 解题思路 回溯法(暴力枚举
阅读全文
摘要:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0 解题思路 简单判断 字符串中包含字符、数字、空格。首先应该去掉前导、后导空格。 上代码(C++香) int StrToInt(string str) { int length = str.
阅读全文
摘要:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。 解题思路 回溯法(较暴力) 重新定义比较数字函数**(较高级)** 上代码(C++香) 法一,回溯法递归出全排列 #inc
阅读全文
摘要:求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现
阅读全文
摘要:HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2}
阅读全文
摘要:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。 下次一定记住不要
阅读全文
摘要:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。 解题思路 排序后遍历(相当于简化后的暴力)O(logn) 借助快排的Partition思想O(n) 上代码(C++香) 法一:排序后遍历(相当于简化后的暴力) class Sol
阅读全文
摘要:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 解题思路 排序后遍历(相当于简化后的暴力)O(logn) 根据数组特点,相当于寻找数组的
阅读全文
摘要:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 解题思路 回溯法,easy 只不过要注意判断字符可能出现连续的重复,则需要判断 上代码(C++香) #include <io
阅读全文
摘要:输入一棵二叉树,将其序列化为char*,并且支持反序列化为二叉树。 解题思路 先序遍历二叉树,序列化 同先序遍历结构,反序列化 代码运行结果没问题,但是未通过所有测试案例。。。 #include <iostream> #include <algorithm> #include <math.h> #i
阅读全文
摘要:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。 解题思路 中序遍历,分治(较难懂) 加入辅助栈存储中序遍历结果,然后修改指针(较简单) 法一:中序遍历+分治 #include <iostream> #include <algorithm> #include <math.h> #incl
阅读全文
摘要:请实现函数RandomList* Clone(RandomList* pHead),复制一个复杂链表。在复杂链表中,每个节点除了有一个next指针,还有一个指向任意一个节点的random指针。 解题思路 这个题目可以分两步来完成: 遍历节点的next指针,先复制出所有的节点 遍历所有节点的rando
阅读全文
摘要:反转单链表的两种方法 今天看了帅地的第二版资料,突然发现单链表的反转居然还可以用递归来做,太妙了吧! 直接上代码,目前只有C++版的(用指针写链表它不香吗?): // 递归法反转单链表 ListNode* reverseListPlus(ListNode* pHead){ if(pHead == n
阅读全文
摘要:如何量化两个字符串之间的相似程度呢?有一个非常著名的量化方法,那就是编辑距离(Edit Distance)。 编辑距离指的就是,将一个字符串转化成另一个字符串,需要的最少编辑操作次数(比如增加一个字符、删除一个字符、替换一个字符)。编辑距离越大,说明两个字符串的相似程度越小;相反,编辑距离就越小,说
阅读全文
摘要:动态规划两种思想 1 状态转移(分状态一步一步走到最后) 2 方程转移(填表) 0-1背包基础问题 0-1背包升级版 女朋友的购物车 三角形中的最短路径 矩阵中的最短路径 硬币找零问题 莱温斯特距离 最长公共子串 最长递增子序列 动态规划的当前状态,就是来自上(多)个状态的max,或者min的一个。
阅读全文
摘要:1 题目描述 淘宝的“双十一”购物节有各种促销活动,比如“满 200 元减 50 元”。假设你女朋友的购物车中有 n 个(n>100)想买的商品,她希望从里面选几个,在凑够满减条件的前提下,让选出来的商品价格总和最大程度地接近满减条件(200 元),这样就可以极大限度地“薅羊毛”。作为程序员的你,能
阅读全文
摘要:1 题目描述 对于一组不同重量、不可分割的物品,我们需要选择一些装入背包,在满足背包最大重量限制的前提下,背包中物品总重量的最大值是多少呢? 刚刚讲的背包问题,只涉及背包重量和物品重量。我们现在引入物品价值这一变量。对于一组不同重量、不同价值、不可分割的物品,我们选择将某些物品装入背包,在满足背包最
阅读全文
摘要:动态规划(1)——0-1背包问题 1 题目描述 对于一组不同重量、不可分割的物品,我们需要选择一些装入背包,在满足背包最大重量限制的前提下,背包中物品总重量的最大值是多少呢? 2 输入 第一行是物品的个数n(1≤n≤100000),背包容量w(1≤w≤1000000); 第二行是n个物品的重量。 3
阅读全文
摘要:1 题目描述 给定无向连通图G=(V, E)和m种不同的颜色,用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中相邻的两个顶点有不同的颜色? 这个问题是图的m可着色判定问题。若一个图最少需要m种颜色才能使图中每条边连接的两个顶点着不同颜色,则称这个数m为该图的色数。求一个图的色
阅读全文
摘要:遇到特殊字符的时候,我们就有多种处理方式了,也就是所谓的岔路口: “*”有多种匹配方案,可以匹配任意个文本串中的字符,我们就先随意的选择一种匹配方案,然后继续考察剩下的字符。如果中途发现无法继续匹配下去了,我们就回到这个岔路口,重新选择一种匹配方案,然后再继续匹配剩下的字符。 "?"有两种匹配方案,
阅读全文
摘要:10^9以下用int,10^18以下用long long。 C++代码如下 #include<iostream> #include<string> #include <limits> using namespace std; int main() { cout << "type: \t\t\t" <
阅读全文
摘要:回溯法其实就是暴力,这个题目就是暴力的n层for(2次)循环。 问题1、给定背包容量w,物品数量n,以及每个物品的重量wi,求背包最多能装多少多重的物品。 问题2、给定背包容量w,物品数量n,以及每个物品的重量wi、价值vi,求背包最多能装多少价值的物品。 这是一个基本的0-1背包问题,每个物品有两
阅读全文
摘要:回溯算法就是个多叉树的遍历问题, 关键就是在前序遍历和后序遍历的位置做⼀些操作, 算法框架如下: void backTrack(...){ if(满足结束条件){ 将路径加入到结果集 return ; } for(选择 in 选择列表){ 判断选择是否合法,如果不合法则进入一下此循环(continu
阅读全文
摘要:C++版本代码如下 #include <iostream> #include <math.h> #include <cstring> using namespace std; #define MAXSIZE 256 int num = 0; // 全局变量或者成员变量 void merge(int
阅读全文
摘要:我们前面几节讲了好几种字符串匹配算法,有 BF 算法、RK 算法、BM 算法、KMP 算法,还有 Trie 树。前面四种算法都是单模式串匹配算法,只有 Trie 树是多模式串匹配算法。 单模式串匹配算法,是在一个模式串和一个主串之间进行匹配,也就是说,在一个主串中查找一个模式串。多模式串匹配算法,就
阅读全文
摘要:Trie 树,也叫“字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。它并不是二叉树,而是“多叉树”。 class TrieNode { char data; TrieNode children[26]; } 刚刚我们在讲
阅读全文
摘要:KMP 算法是根据三位作者(D.E.Knuth,J.H.Morris 和 V.R.Pratt)的名字来命名的,算法的全称是 Knuth Morris Pratt 算法,简称为 KMP 算法。 KMP 算法的核心思想,跟上一节讲的BM算法非常相近。我们假设主串是 a,模式串是 b。在模式串与主串匹配的
阅读全文
摘要:1 BM(Boyer-Moore)算法 它是一种非常高效的字符串匹配算法,有实验统计,它的性能是著名的KMP算法的 3 到 4 倍。BM 算法核心思想是,利用模式串本身的特点,在模式串中某个字符与主串不能匹配的时候,将模式串往后多滑动几位,以此来减少不必要的字符比较,提高匹配的效率。BM 算法构建的
阅读全文
摘要:1 在有数组作为参数的函数里,这个时候的参数已经不是数组,而是“指针” 总所周知,在C++中我们通过sizeof(arr)/sizeof(arr[0])来获取数组arr的长度。但是当数组作为函数参数时,不能再使用sizeof(arr)来获取数组的总大小,或者使用sizeof(arr)/sizeof(
阅读全文
摘要:素数(质数):一个大于1的自然数,除了1和它自身以外,不能整除其它的自然数。 合数:一个大于1的自然数,除了1和它自身以外,还能整除其它的自然数。 其实大于1的自然数中,如果不是素数(质数),那么它就是合数 扩展: 所有大于2的偶数都是合数 所有大于5的奇数中,个位为5的都是合数 最小的(耦)合数为
阅读全文
摘要:1 深度优先搜索(DFS) 深度优先搜索(Depth-First-Search),简称 DFS。最直观的例子就是“走迷宫”。假设你站在迷宫的某个岔路口,然后想找到出口。你随意选择一个岔路口来走,走着走着发现走不通的时候,你就回退到上一个岔路口,重新选择一条路继续走,直到最终找到出口。这种走法就是一种
阅读全文
摘要:1 邻接矩阵存储方法(Adjacency Matrix) 邻接矩阵的底层依赖一个二维数组。对于无向图来说,如果顶点 i 与顶点 j 之间有边,我们就将 A[i][j]和 A[j][i]标记为 1;对于有向图来说,如果顶点 i 到顶点 j 之间,有一条箭头从顶点 i 指向顶点 j 的边,那我们就将 A
阅读全文
摘要:1 如何理解堆? 堆是一种特殊的树。只要满足以下两点,它就是一个堆: 堆是一个完全二叉树; 堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值。 第一点,堆必须是一个完全二叉树。还记得我们之前讲的完全二叉树的定义吗?完全二叉树要求,除了最后一层,其他层的节点个数都是满的,最后一层的节
阅读全文
摘要:1 求解思路 全排列表示把集合中元素的所有按照一定的顺序排列起来,使用P(n, n) = n!表示n个元素全排列的个数。P(n, n)中的第一个n表示元素的个数,第二个n表示取多少个元素进行排列。 给定一个n个元素数组,其全排列的过程可以描述如下: 任意取一个元素放在第一个位置,则有n种选择; 再剩
阅读全文
摘要:前言 二叉查找树是最常用的一种二叉树,它支持快速插入、删除、查找操作,各个操作的时间复杂度跟树的高度成正比,理想情况下,时间复杂度是O(logn)。 不过,二叉查找树在频繁的动态更新过程中,可能会出现树的高度远大于log2n 的情况,从而导致各个操作的效率下降。极端情况下,二叉树会退化为链表,时间复
阅读全文
摘要:高度(Height)、深度(Depth)、层(Level)。它们的定义是这样的:
阅读全文
摘要:创建1个节点 连接3个节点 前序遍历、中序遍历、后续遍历二叉树(包括递归法与非递归法(辅助栈)) 清除二叉树 在二叉搜索树中插入1个节点(和链表一样,注意使用二级指针,因为可能插入的是根节点) 在二叉搜索树中查找1个节点 在二叉搜索树中删除一个节点(和链表一样,注意使用二级指针,因为可能删除的是根节
阅读全文
摘要:带着问题来学习: 如何防止数据库中的用户信息被脱库? 你会如何存储用户密码这么重要的数据吗?仅仅 MD5 加密一下存储就够了吗? 在实际开发中,我们应该如何用哈希算法解决问题? 一、什么是哈希算法? 不管是“散列”还是“哈希”,这都是中文翻译的差别,英文其实就是“Hash”。 1.1 定义 将任意长
阅读全文
摘要:一、为什么散列表和链表经常放在一起使用? 1.散列表的优点:支持高效的数据插入、删除和查找操作 2.散列表的缺点:不支持快速顺序遍历散列表中的数据 3.如何按照顺序快速遍历散列表的数据?只能将数据转移到数组,然后排序,最后再遍历数据。 4.我们知道散列表是动态的数据结构,需要频繁的插入和删除数据,那
阅读全文
摘要:Java中的HashMap、LinkedHashMap的解决散列冲突策略都是链表法(数据规模大),但多线程中的ThreadLocalMap则是用的开放寻址法(因为规模数据小、装载因子不高)。 何为一个工业级的散列表?工业级的散列表应该具有哪些特性? 1.支持快速的查询、插入、删除操作; 2.内存占用
阅读全文
摘要:一、线性排序算法介绍 线性排序算法包括桶排序、计数排序、基数排序。 线性排序算法的时间复杂度为O(n)。 此3种排序算法都不涉及元素之间的比较操作,是非基于比较的排序算法。 对排序数据的要求很苛刻,重点掌握此3种排序算法的适用场景。 二、桶排序(Bucket sort) 2.1 算法原理 1)将要排
阅读全文
摘要:一、什么是跳表? 为一个值有序的链表建立多级索引,比如每2个节点提取一个节点到上一级,我们把抽出来的那一级叫做索引或索引层。如下图所示,其中down表示down指针,指向下一级节点。以此类推,对于节点数为n的链表,大约可以建立log2n-1级索引。像这种为链表建立多级索引的数据结构就称为跳表。 二、
阅读全文
摘要:查找第一个值等于给定值的元素 查找最后一个值等于给定值的元素 查找第一个大于等于给定值的元素 查找最后一个小于等于给定值的元素 查找循环有序数组中等于给定值的元素 #include <iostream> #include <vector> #include <stack> #include <cst
阅读全文
摘要:时间复杂度O(logn),很强 适用于数组的数据结构,但不适用于链表,因为链表不支持随机访问 只能查找有序数组,如果是无序的,需要进行一次排序(最低时间复杂度O(nlogn)) 数据量小不适用,直接用遍历查找即可 数据量太大也不适用,因为数据结构是数组,需要的是连续的内存空间 #include <i
阅读全文
摘要:优先使用归并排序(因为归并排序空间复杂度是O(n),并且是稳定排序算法,时间复杂度O(nlogn)) 当需排序的数据量比较大的时候,改为使用优化快排(比如三数取中获取分区点) 当快排时,排序的元素个数小于7时,快排退化为插入排序 传统的快排算法,由于分区点选的不好,可能就会导致算法效率过低。常用分区
阅读全文
摘要:从尾到头打印链表(要求不改变链表结构) 反转链表(要求仅遍历一次链表) 合并两个有序链表(非递归方法) 删除倒数第k个节点 链表中环的入口节点(包括判断环的存在,确定环中节点个数等问题) 求链表中间节点 ListNode.h #pragma once #include <iostream> usin
阅读全文
摘要:正宗快速排序算法C++版本,看图一目了然。 归并排序和快速排序都用到了分治思想。这两种排序算法适合大规模的数据排序。 平均时间复杂度O(nlogn)。 空间复杂度O(logn)~O(n)。 #include <iostream> #include <vector> #include <stack>
阅读全文