![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 78
bugcoder-9905
长期更新学习笔记
展开
-
【美团3.18校招真题2】
由于字符串经过修改一定为回文串,且最多修改两次,所以原字符串位置。不一样的个数最多为2。所以统计一下需要改的位置个数,记为cnt。原创 2023-09-08 22:56:00 · 300 阅读 · 0 评论 -
【美团3.18校招真题1】
首先用r指针不断往map中添加数据,直到map中的数据多于k个,此时让mp.size() = k + 1的元素4已经放入了mp,且r又++了(此时元素5还没放入map),不算map中最后放入的那个元素,map正好存放的是存放k种数字的所有元素。map中始终存放[l,r]区间内的数据,mp.size()原创 2023-09-08 22:53:28 · 572 阅读 · 0 评论 -
大数加减法
#include <iostream>#include <string>#include <algorithm>//泛型算法 using namespace std;//编程题目:请实现以下类的方法,完成大数的加减法class BigInt{public: BigInt(string str) { sign = (str[0] == '-') ? '-' : '+'; if (sign == '-') { str_num = string(原创 2022-05-16 21:49:41 · 258 阅读 · 0 评论 -
C++ STL中的sort源码浅析
文章目录元素少,使用插入排序递归次数过多,使用堆排序主体使用快速排序总结首先提出几个问题:C++ STL默认提供以下两个sort接口void std::sort(const _RanIt _First, const _RanIt _Last)void std::sort(const _RanIt _First, const _RanIt _Last, _Pr _Pred)第一个函数的参数是排序区间,第二个函数的参数是排序区间和指定排序方式的函数对象C++ STL默认使用less函数对象,进行原创 2022-05-16 11:44:34 · 3982 阅读 · 1 评论 -
海量数据求top K
文章目录一、大根堆/小根堆二、快排分割三、海量数据查重和topK的综合应用1. 题目1:数据的重复次数最大/最小的前K个/第K个2. 题目2:有一个大文件,内存限制200M,求文件中重复次数最多的前10个top K问题:给定10000个整数,找出前10大的元素一、大根堆/小根堆先用前10个整数创建一个小根堆(最小值就在堆顶),然后遍历剩下的整数,如果整数比堆顶元素大,那么堆顶元素出堆,然后再把整数入堆,遍历完所有整数,小根堆里面放的就是值最大的前10个元素了大根堆淘汰大的,用于找top K小的;原创 2022-05-12 21:32:52 · 354 阅读 · 0 评论 -
海量数据哈希表查重
文章目录一、海量数据的查重问题二、无限制哈希表查重(重复出现的数字、重复出现的次数、第几个重复)三、内存限制哈希表查重(重复出现的数字以及出现的次数)四、哈希表unordered_set查重(第几个重复)五、位图查重(第几个重复)查重:数据是否有重复,以及数据重复的次数topK:有几亿个数字。求元素的值,前K大/小,第K大/小去重:去掉重复多次的数字,数字只保留一份一、海量数据的查重问题哈希表:得看有没有对内存的限制,如果没有限制,就是直接用哈希表解决。比如说 50亿(5G)个整数的查重问题原创 2022-05-12 17:14:26 · 952 阅读 · 0 评论 -
DFS/BFS搜索迷宫路径
文章目录一、DFS搜索迷宫路径二、BFS搜索迷宫路径一、DFS搜索迷宫路径DFS依赖栈结构先把左上角节点入栈,然后依次查看栈顶元素的右、下、左、上四个方向是否可以走,如果能走就把节点入栈,然后再依次查看依次查看栈顶元素的右、下、左、上四个方向;如果四个方向都不能走,就把栈顶元素出栈最终栈空,则说明退回到了左上角的节点;右下角的节点入栈,则表示找到了出口需要注意的是,每入栈一个节点:需要将当前节点到入栈节点的方向置为NO,保证如果走进死胡同回退后,不会再次往这个错误的方向走需要将刚入栈节原创 2022-05-11 21:23:47 · 1434 阅读 · 0 评论 -
深入理解KMP算法
一、暴力搜索算法二、KMP算法思想三、求解next数组四、KMP算法实现五、KMP算法的优化原创 2022-04-04 11:20:48 · 708 阅读 · 0 评论 -
二叉平衡搜索树AVL树
一、AVL树的节点平衡旋转操作1. 右旋2. 左旋3. 左 - 右旋转4. 右 - 左旋转二、AVL树的代码实现1. insert实现2. remove实现原创 2022-02-16 21:40:35 · 263 阅读 · 0 评论 -
KMP算法
一、朴素模式匹配算法在主串strstrstr中匹配子串subStrsubStrsubStr,若strstrstr中存在subStrsubStrsubStr,则返回字串在主串中第一次出现的索引。不存在,则返回-1。在 “helloworld” 中匹配 “llo”,匹配成功时的指针状态。朴素模式匹配算法的实现代码:int Index(string str, string subStr){ int cur = 0; int j = 0; int i = cur; wh原创 2020-08-05 11:10:34 · 181 阅读 · 0 评论 -
BST二叉搜索树常见遍历操作以及面试常见编程题
二叉搜索树原创 2021-12-11 16:29:19 · 853 阅读 · 0 评论 -
深度剖析SGI STL二级空间配置器内存池源码
文章目录一、SGI STL二级空间配置器重要成员解读1. 二级空间配置器内存池的结构2. 两个重要的函数(1) _S_round_up(2)_S_freelist_index3. 内存池allocate分配过程一、SGI STL二级空间配置器重要成员解读SGI STL包含了一级空间配置器和二级空间配置器其中一级空间配置器allocator采用malloc和free来管理内存,和C++标准库中提供的allocator是一样的但其二级空间配置器allocator采用了基于freelist自由链表原理的原创 2021-11-11 21:54:46 · 1277 阅读 · 2 评论 -
哈希表&位图&topk&一致性哈希算法
一、线性探测哈希表哈希表的长度最好是素数表中的数,哈希表扩容的时候也是从哈希表中取得,扩容后需要把原来表中的数据重新哈希,存入新的哈希表装载因子:当表的使用量 超过 总容量 * 装载因子 时,需要进行扩容,使用哈希表的 均摊时间复杂度是O(1)enum State { UNUSE, // 从未被使用 USING, // 正在使用 DELETE // 使用后被删除};struct Node { Node(int val = 0, State state = UNUSE)原创 2021-10-29 15:53:15 · 428 阅读 · 0 评论 -
重刷搜索排序算法
一、二分搜索算法1. 非递归代码// 找到返回索引,找不到返回-1int binary_search(const vector<int>& vec, int val) { int left = 0; int right = vec.size() - 1; while (left <= right) { int mid = (left + right) >> 1; if (vec[mid] == val) { return mid; }原创 2021-10-22 22:42:40 · 427 阅读 · 0 评论 -
二叉树从根结点到叶结点系列
算法思想:访问的当前结点为空时,直接退出当前函数访问的当前结点不空时,都将当前结点值存入数组。当前结点为叶结点时,就直接输出当前的数组。当前结点为内部结点时,直接递归地调用函数,访问下层结点注:pathpathpath表示访问当前结点时,传入函数的数组#include<iostream>#include<vector>using namespace std;struct TreeNode { int val; TreeNode *left;原创 2020-09-20 00:19:48 · 1840 阅读 · 0 评论 -
摩尔投票法
该题默认存在占比多于一半的元素,故该元素的数量 - 其他元素的数量 > 0,可用摩尔投票法。思路:候选元素(cur)初始化为nums[0],票数cnt初始化为1。当遇到与cur相同的数,则票数cnt++,否则票数cnt- -。当票数cnt为0时,更换候选元素,并将票数cnt重置为1。int majorityElement(vector<int>& nums) { int cnt = 1; int cur = nums[0]; .原创 2020-07-04 23:17:06 · 200 阅读 · 0 评论 -
C++中关于字符以及字符串的判断
相关的库函数isalnum():判断bai字符du是否是字母或数字isalpha():判断字符是否是字母isdigit():判断字符是否是数字ispunct():判断字符是否是标点符号isupper():判断字符是否是大写字母isxdigit():判断字符是否是十六进制数toupper():转换为大写字母tolower():转换为小写字母思路:1、回文串判断,首尾比较。忽略大小写,所以可以将字符转换为小写比较2、只考虑数字和字母,可以使用isalnum(数字或字母返回非0,其他返原创 2020-07-03 12:38:04 · 6443 阅读 · 0 评论 -
总结经典动态规划——01背包
题目描述已知有n 个物品和一个承重为 content 的背包,物品 i 的重量以及价值分别为 weight[i]、 value[i] 。问:应如何选择装入背包的物品,使得装入背包中的物品的总价值最大?众所周知,这题是动态规划的入门题。那么什么是动态规划?我的理解是,当大问题难以解决时,先用求解小问题,然后后面求解大问题的时候我们就可以直接拿着小问题的结果来计算大问题。对于01背包,大问题就是已知背包容量和物品的重量和价值,让你选择不止一个物品使得背包价值最大。1. 背包容量小于当前物品重量那原创 2020-06-21 00:06:39 · 251 阅读 · 0 评论 -
快速幂算法
【二进制快速幂】比如我们计算pow(3,5),将5改写成二进制101,我们可以将算法过程写成以下形式:这就将原本的4次乘法改成了2次乘法,其次我们将每个乘积项设成x,每次对x进行平方,从而构造下一个乘积项。当二进制的当前位为1时,将当前乘积项x乘入最终结果,否则不乘入最终结果。可借助位运算来实现:b & 1 //取 b 二进制的最低位,判断和 1 是否相同,相同返回 1,否则返回 0,用于判断奇偶b>>=1 //把 b 的二进制右移一位,并赋给当前的b还需要注意的是,当原创 2020-05-29 11:50:16 · 305 阅读 · 0 评论 -
根据先序中序还原二叉树
先序遍历:根 —> 左 —> 右中序遍历:左 —> 根 —> 右后序遍历:左 —> 右 —>根算法思想:根据先序遍历的特点,第一个遍历的结点就是根结点,我们找到根结点根据中序遍历的特点,我们知道此根结点左边的序列为左子树,根结点右侧的序列为右子树根据原始的先序和中序遍历结果,得到左右子树的先序和中序遍历结果,递归还原二叉树举例:p...原创 2020-05-08 00:06:21 · 3803 阅读 · 1 评论 -
LeetCode求两个数组的交集
题目描述class Solution {public: vector<int> intersection(vector<int>& nums1, vector<int>& nums2){ set<int> s(nums1.begin(), nums1.end()); vector<i...原创 2020-04-28 00:35:20 · 309 阅读 · 0 评论 -
LeetCode广搜深搜专题
题目描述这题是可以被一步捕获的棋子数的升级版,“可以被一步捕获的棋子数”只是从一个点开始遍历,而本题把所有的点都作为起始点遍历int visit(vector<vector<int>>& grid, int init_x, int init_y){ //这里判断时要注意,一定先判断是否越界,再判断值是否为0,否则报错看不出来,我就找了好长时间。。。 ...原创 2020-04-14 17:29:11 · 313 阅读 · 0 评论 -
LeetCode零钱兑换(dp)
题目描述用coins = [1, 2, 5], amount = 11举例组成11的硬币数,考虑最后一枚硬币是1、2、5,可以分3种情况:最后一枚硬币是1元:num1 = 【组成10的最小硬币数】+ 1(1枚1元硬币)最后一枚硬币是2元:num2 = 【组成9的最小硬币数】+ 1(1枚1元硬币)最后一枚硬币是5元:num3 = 【组成6的最小硬币数】+ 1(1枚1元硬币)综合上述...原创 2020-04-12 11:17:44 · 196 阅读 · 0 评论 -
LeetCode将数组分成和相等的三个部分
题目描述方法一:直接遍历从前往后遍历,记录下和为sum/3的序列数量,找到3个就返回true遍历完了,依然没有找到3个和为sum/3的序列,返回falsebool canThreePartsEqualSum(vector<int>& A) { int sum = 0; for(int num : A) sum += num;/...原创 2020-04-11 18:36:58 · 231 阅读 · 0 评论 -
LeetCode拼写单词
刷题笔记,随便记一记题目描述方法一:构造哈希表主要思路:给单词表构造一个哈希表,再给单词构造一个哈希表,对比每个字符的大小关系即可class Solution {public: map<char, int> getWordWap(string word){ map<char, int> res;//为每个单词以及字母表构造哈希表 ...原创 2020-04-10 19:26:49 · 164 阅读 · 0 评论 -
两种方法解LeetCode和为s的连续正数序列
题目描述方法一:数学方法头一次自己想的方法不仅能通过,而且效率还挺高,先看一下数学方法的提交结果其实思路也很简单:分析题目可知得到的序列为等差数列,那我们只要知道每个序列的起始值以及序列的长度,我们就可以构造出整个序列,然后用一个临时的vector保存此序列,最后将临时的vector加入二维数组(vector<vector> res)即可首先确定序列的大小,序列的大小为 [...原创 2020-04-06 22:22:57 · 275 阅读 · 0 评论 -
LeetCode约瑟夫环
题目描述方法一这是一种思路最直白的方法,构造一个数组,每次往后数m-1个就移除该元素。往后数m-1个的过程中由于是线性数据结构,需要对当前数组长度取模int lastRemaining(int n, int m) { vector<int> nums; for(int i=0; i<n; i++){ nums.pus...原创 2020-04-05 20:18:14 · 700 阅读 · 0 评论 -
LeetCode字符串压缩
题目描述遍历法在C++中s += s1 等价于s.append(s1),不产生新的对象。不利用额外空间s = s + s1 是先创建一个string对象,再把s1的内容赋值给s(s的地址不变),利用额外空间string compressString(string S) { if(S.size() == 1) return S; string res;...原创 2020-04-04 23:48:42 · 196 阅读 · 0 评论 -
TopK问题
题目描述下面介绍三种方法一、暴力法class Solution {public: vector<int> getLeastNumbers(vector<int>& arr, int k) { sort(arr.begin(),arr.end(), less<int>()); vector<int&g...原创 2020-04-03 23:54:29 · 142 阅读 · 0 评论 -
LeetCode求二叉树直径
题目描述题目分析所谓求直径,就是求左右子树深度之和,而这个题又不能仅仅是考虑左右子树的而深度之和,因为求直径的时候可以不经过根结点。也就意味着如果root结点的右子树只有一层,而左子树却长满了结点,直接求root结点两子树的深度之和就错了。下面是我想的一个比较暴力的方法:首先遍历二叉树,把所有的内部结点都用数组保存(因为叶结点的直径为0),后面对每个结点求直径,返回最大值。class S...原创 2020-04-01 13:00:17 · 168 阅读 · 0 评论 -
【dp】LeetCode打家劫舍系列
题目描述这题一看就知道得用动态规划做,本来在学校是学过的,但缺少实践,理论知识也忘得差不多了,看到这题还是不知道该怎么用dp解,只能翻看题解,理解后独立写出代码dp方程如下:dp[i] = max(dp[i-2] + nums[i] , dp[i-1])dp[i]表示偷了 i 家时,获得的最大收益nums[i]表示当前准备偷的房屋有多少钱理解下来就是:偷了 i 家后,我所获得的最大...原创 2020-03-30 13:20:54 · 267 阅读 · 0 评论 -
LeetCode对称二叉树
题目描述看到这题就知道要用递归,哎,最讨厌二叉树的题,就是因为不理解递归。有什么办法呢,越是不会越要学会,硬着头皮做吧。emmm,想了10分钟,不会。。算了,直接看评论吧,于是我看到了一长段话,如下:根据提示,我开始写代码,附上本人的辣鸡代码class Solution {public: bool judge(TreeNode* l , TreeNode* r){ ...原创 2020-03-29 23:35:30 · 109 阅读 · 0 评论 -
LeetCode回文链表
题目描述不写博客怕把刷过的题给忘了,写一篇博客当作自己的刷题笔记分析题目要求用O(n)的时间复杂度和O(1)的空间复杂度,显然不能用数组将链表的值记录下来再判断了先用快慢指针(快2慢1)找到链表的中间位置,然后把前半部分的链表就地逆置逆置完再比较两个链表的值是否相等bool isPalindrome(ListNode* head) { if(head == NUL...原创 2020-03-28 10:33:11 · 159 阅读 · 0 评论 -
LeetCode反转二叉树
题目描述方法一:中序遍历TreeNode* invertTree(TreeNode* root) { if(root == NULL) return NULL; //找到左结点 invertTree(root->left); //开始交换孩子结点 TreeNode* temp = root->left...原创 2020-03-26 16:25:40 · 157 阅读 · 0 评论 -
逆置单链表
1、基本声明#include<stdio.h>#include<stdlib.h>typedef int datatype;typedef struct node{ datatype data; struct node *next;}LNode;2、尾接法创建单链表LNode* tail_create(LNode *head){ ...原创 2019-02-28 17:08:59 · 272 阅读 · 0 评论 -
LeetCode动态规划专题
题目描述虽然这题标记的是简单,个人感觉还是挺难的。。。也许是我太菜了吧,找了题解才会做,看了大佬的题解后,发现这是一种题型,真是醍醐灌顶。觉得应该总结一下,作为自己的刷题笔记。下面进入正文。老司机一眼可以看出,这种求差问题可以转换成区间和的问题(emmmmm,我肯定看不出来)。为什么呢?因为我们有牛顿莱布尼茨公式:∫abf(x)dx=F(x)∣ab=F(b)−F(a)\int_a^bf(x...原创 2020-02-26 14:58:57 · 333 阅读 · 0 评论 -
LeetCode三种方法求二叉树深度(C++代码简单易懂)
题目描述在线提交地址:点击跳转方法一:递归int maxDepth(TreeNode* root) { if(root == NULL) return 0; int leftDepth = maxDepth(root->left) + 1; int rightDepth = maxDepth(root->right) + ...原创 2020-02-25 21:17:12 · 2409 阅读 · 0 评论 -
LeetCode和为k的子数组&两数之和(哈希表的用法)
题目说明方法一:暴力法int subarraySum(vector<int>& nums, int k) { int count = 0; for(int start = 0; start < nums.size(); start++){ int sum = 0; for(int end = 0; end < nums.size(); ...原创 2020-02-24 14:28:05 · 197 阅读 · 0 评论 -
LeetCode字符串相加&字符串相乘
题目描述解题思路:从后往前依次取数字字符,将两个数字字符转换为数字后相加,并计算进位数字串不等长时,在计算时可以把比较短的数字串的字符当作 ‘0’,以免单独考虑当其中一个计算到头时,还要将里一个数字串的剩余部分转移到res,同时还得单独考虑进位(一开始这么做的,很复杂)不管是两个数字串都没计算完,还是一个已经计算完(9993+9),或是两个都计算完了(46+90),都存在进位的情况(w...原创 2020-02-18 21:30:18 · 346 阅读 · 0 评论 -
LeetCode电话号码的字母组合(队列实现)
问题描述算法思想1、先将digits[0]中的字符序列转换成string,入队列2、将当前队列中的元素与后续digits[i++]中所代表的字符序列一一结合,结合后都入队列3、当前队列的某个元素与后续3-4个字符结合完成后,出队列4、循环完成后,最终队列中的元素就是结果#include<iostream>#include<string>#include&l...原创 2020-02-12 16:26:21 · 373 阅读 · 0 评论