![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 80
shelven丶
转战知乎,欢迎关注ShaVenZz
展开
-
幸运N串
小A很喜欢字母N,他认为连续的N串是他的幸运串。有一天小A看到了一个全部由大写字母组成的字符串,他被允许改变最多2个大写字母(也允许不改变或者只改变1个大写字母),使得字符串中所包含的最长的连续的N串的长度最长。你能帮助他吗?输入描述:输入的第一行是一个正整数T(0 < T <= 20),表示有T组测试数据。对于每一个测试数据包含一行大写字符串S(0 < |S| <= 50000,|S|表示字符串长度)。数据范围:20%的数据中,字符串长度不超过100;70%的数据中,字符原创 2020-08-09 21:14:44 · 462 阅读 · 0 评论 -
输出所有子串
#include<bits/stdc++.h>using namespace std;int main(){ string s; cin >> s; for (int i = 0; i < s.size(); i++) { for (int j = 1; j <= (s.substr(i)).size(); j++) { cout << s.substr(i, j) << endl; } }}原创 2020-08-09 14:59:07 · 755 阅读 · 0 评论 -
2020-08-07
#include <bits/stdc++.h>using namespace std;struct cmp1{ bool operator ()(int& a, int& b) { return a > b; }};int main(){ int K = 0; cin >> K; priority_queue<int, vector<int>, cmp1> minHeap; vector<int原创 2020-08-07 17:47:39 · 237 阅读 · 0 评论 -
打印函数调用堆栈
入职腾讯以来,天天都很忙。今天难得清闲,借此机会记录一下前段时间搞的一个小功能,打印函数的调用堆栈。什么是函数的调用堆栈?给你看一段代码你马上就明白了。比如我在DecideAllTaskID中调用A,那么打log之后我们就可以看到LogBacktrace的堆栈回溯结果了。以上就是堆栈回溯的结果了,前面两个null可能是符号表中没有找到符号。那我就直接堆栈回溯的代码了...原创 2020-07-15 10:54:33 · 1172 阅读 · 0 评论 -
9. 回文数
这个题很经典,判断数字是否是回文数。力扣上是简单级别的。但题目要求不许转成string。仔细想想发现这题还真不简单。转成字符串的解法就不贴了,这里主要记录一下不转成字符串的解法。bool isPalindrome(int x){ if (x == 0)return 1; if (x < 0)return 0; long r = 0, t = x; while (t) { r = r * 10 + t % 10; t /= 10; } return x == r;}.原创 2020-06-10 20:47:01 · 122 阅读 · 0 评论 -
单调栈问题
什么是单调栈?从名字上就听的出来,单调栈中存放的数据应该是有序的,所以单调栈也分为单调递增栈和单调递减栈单调递增栈:栈中数据出栈的序列为单调递增序列单调递减栈:栈中数据出栈的序列为单调递减序列ps:这里一定要注意所说的递增递减指的是出栈的顺序,而不是在栈中数据的顺序单调栈板子题:2020年腾讯校招笔试真题 第二题这题就是一个很明显的单调栈问题,直接上板子,5分钟解决。#include<bits/stdc++.h>using namespace std;int main(v原创 2020-06-07 14:05:30 · 188 阅读 · 0 评论 -
LCS
#include <bits/stdc++.h>using namespace std;int main(){ string s1, s2; cin >> s1; cin >> s2; int l1 = s1.size(), l2 = s2.size(), res = 0; vector<vector<int>> dp(...原创 2020-04-28 15:59:04 · 199 阅读 · 0 评论 -
并查集套路以及例题
例题:力扣547 一道经典的并查集class Solution {public: int pre[2000] = { 0 }; int find(int x) { while (pre[x] != x)x = pre[x]; return x; } void merge(int x, int y) { int a = find(x); int b = find(y...原创 2020-04-12 13:27:27 · 216 阅读 · 0 评论 -
滑动窗口套路以及例题
主要解决求最长不重复子串问题题解:#include<bits/stdc++.h>using namespace std;int main(){ int z, l = 0, r = 0, sum = 0; vector<int> vi; cin >> z; set<int> si; while (z--) { int c...原创 2020-04-11 16:57:11 · 459 阅读 · 0 评论 -
C++全排列函数
题目描述牛牛有一个正整数x,牛牛需要把数字x中的数位进行重排得到一个新数(不同于x的数),牛牛想知道这个新数是否可能是原x的倍数。请你来帮他解决这个问题。输入描述:输入包括t+1行,第一行包括一个整数t(1 ≤ t ≤ 10), 接下来t行,每行一个整数x(1 ≤ x ≤ 10^6)输出描述:对于每个x,如果可能重排之后变为自己的倍数输出"Possible", 否则输出"Imp...原创 2020-04-08 22:06:43 · 233 阅读 · 0 评论 -
面试题 16.07. 最大数值
int maximum(int a, int b){ long k = (((long)a - (long)b) >> 63) & 1;//取符号位 return b * k + a * (k ^ 1);}思路:问题两个,一个是怎么取出int类型的符号位,另一个是超过int类型怎么办。这里需要了解一下long或者是int类型了。符号位都是在第一位上的,也就是说l...原创 2020-03-03 19:57:41 · 174 阅读 · 0 评论 -
面试题 02.01. 移除重复节点
ListNode* removeDuplicateNodes(ListNode* head){ if (head == NULL || head->next == NULL) return head; set<int> si; ListNode* l1 = head, * l2 = head->next; si.insert(l1->val); while...原创 2020-03-02 22:11:10 · 106 阅读 · 0 评论 -
摩尔多数表决算法(Moore Majority Vote Algorithm)
摩尔多数表决算法(Moore majority vote algorithm)也叫摩尔投票法。摩尔投票算法是一种使用线性时间和常数空间查找大部分元素序列的算法。它以1981年出版的Robert S. Boyer和J Strother Moore的名字命名,并且是流式算法的典型例子。首先请考虑最基本的摩尔投票问题:找出一组数字序列中出现次数大于总数1/2的数字(并且假设这个数字一定存在)...转载 2020-01-05 15:10:44 · 1884 阅读 · 0 评论 -
BST的后序遍历序列
递归:bool pp(const vector<int> vi, int start, int end){ if (start >= end)return 1; int i = start; while (i <= end && vi[i] < vi[end])i++; for (int j = i;j <= end;j++)if (...原创 2020-01-03 14:08:43 · 525 阅读 · 0 评论 -
54. 螺旋矩阵
vector<int> spiralOrder(vector<vector<int>>& matrix){ vector<int> vi; if (matrix.size() == 0 || matrix[0].size() == 0)return vi; int row = matrix[0].size(), line = matr...原创 2020-01-02 20:25:54 · 108 阅读 · 0 评论 -
打印从1到最大的n位数
题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。题目乍一看很简单,看到这个问题的时候,最容易想到的方法就是先求出最大的n位数,然后一个循环开始打印。这样想是没错的,那现在我给你一个很大的n呢?如果n比longlong还大呢?很显然上面的想法在大数问题下已经行不通了。我们可以换一种思路:在字符串上模拟数字加法,之后打印字符...原创 2020-01-01 15:11:46 · 141 阅读 · 0 评论 -
343. 整数拆分
可以用dp做,但是时间复杂度O(n^2),空间复杂度O(n),效果很不理想,尽管这道题考察的是dp。但是算法的根本目的是以最高性能解决实际问题。这里贴一个数学方法。int integerBreak(int n){ if (n <= 2)return 1; if (n == 3)return 2; int i = 0, a = 1; while (n > 4) { n...原创 2019-12-31 16:41:29 · 94 阅读 · 0 评论 -
287. 寻找重复数
题目乍一看很简单,但是记住,简单的问题既然问出来,那就一定不简单。第一种方法(弟中弟解法):int findDuplicate(vector<int>& nums){ if (nums.size() == 0)return 0; sort(nums.begin(), nums.end()); for (int i = 0; i < nums.size() - ...原创 2019-12-27 16:29:44 · 158 阅读 · 0 评论 -
循环队列
顾名思义,循环队列是一种队列。循环队列常用与服务器用户排队等待情况。循环队列具有头指针f和尾指针r,头指针f指向队列中实际存在的第一个值,r指向队列中实际存在的最后一个值的下一个位置。为什么要指向下一个位置?我们先假设尾指针r指向队列中实际存在的最后一个值。f为首,r为尾push:r=(r+1)%npop:f=(f+1)%n什么时候队列为空呢?删完了不就为空了,那么我们让f开始删...原创 2019-12-25 21:24:53 · 903 阅读 · 0 评论 -
快速幂
一般求a的b次是这样写:int poww(int a, int b){ int ans = 1; while (b--)ans *= a; return ans;}这样确实没问题,但是时间复杂度是O(n)。如果要计算2的100次,那就要跑100次while循环,效率很低。快速幂假设要求2的11次,其实可以把11拆分成2进制形式:11的2进制是 1011a11=a(2^ 0...原创 2019-12-25 16:27:45 · 94 阅读 · 0 评论 -
1010. 总持续时间可被 60 整除的歌曲
int numPairsDivisibleBy60(vector<int>& time){ map<int, int> mii; int index = 0; for (int i : time) { i %= 60; if (i != 0)index += mii[60 - i]; else index += mii[0]; mii[i]...原创 2019-12-25 14:21:03 · 93 阅读 · 0 评论 -
367. 有效的完全平方数
自己写的渣解 竟然跑到1344ms 也是真够渣的。。。bool isPerfectSquare(int num){ if (num == 1)return true; int k = num >> 1; bool cxk = false; float f = 0; for (int i = 1; i <= k; i++) { if ((float)num / ...原创 2019-12-25 13:36:59 · 110 阅读 · 0 评论 -
203. 移除链表元素
class Solution {public: ListNode* removeElements(ListNode* head, int val) { ListNode* h = new ListNode(0);//这里必须给一个值 h->next = head; ListNode* c = h; while (c->next)...原创 2019-12-24 17:41:36 · 119 阅读 · 0 评论 -
二叉树的Morris遍历
第一天,面试官让你写个二叉树的遍历,你兴高采烈的写了前序,中序,后序的二叉树遍历递归版本。面试官看了以后,对你说道:回家等通知吧(卒)。第二天,另一家公司的面试官又让你写个二叉树的遍历,由于有了第一次的教训,你写了前中后序的非递归版本。面试官看了以后,对你说道:不错,回家等通知吧(卒)。二叉树遍历这种人人都会的简单问题既然问出来,那就一定不简单。今天讲一个二叉树的Morris遍历算法。我们都...原创 2019-12-09 19:48:31 · 190 阅读 · 0 评论 -
459. 重复的子字符串
#include <bits/stdc++.h>using namespace std;bool repeatedSubstringPattern(string s){ string t = s + s; t = t.substr(1, t.size() - 2); return t.find(s) != t.npos;}思路:如果一个字符串可有由一个子字符串t多...原创 2019-12-01 13:11:15 · 103 阅读 · 0 评论 -
231. 2的幂
class Solution {public:bool isPowerOfTwo(int n){ return n > 0 && 2147483648 % n == 0;}}; 思路:一个整数如果是2的幂次方,必定可以被2的31次幂整除。原创 2019-11-27 21:33:22 · 100 阅读 · 0 评论 -
263. 丑数
#include<bits/stdc++.h>using namespace std;bool isUgly(int num){ if (num < 1)return false; while (num % 2 == 0)num >>= 1; while (num % 3 == 0)num /= 3; while (num % 5 == 0)num ...原创 2019-11-27 12:26:18 · 77 阅读 · 0 评论 -
859. 亲密字符串
#include<bits/stdc++.h>using namespace std;bool buddyStrings(string A, string B){ vector<int> vi1(26, 0), vi2 = vi1;//两个数组存每个字母出现的次数 if (A.size() != B.size())return false; int inde...原创 2019-11-22 12:33:50 · 91 阅读 · 0 评论 -
Kruskal算法
Kruskal算法是一种用来寻找最小生成树的算法之一。该算法需要用到两个数据结构:存储边的顶点和权值的数据结构并查集图的存储结构:(0,1)1(2,4)2(3,5)3(1,4)4(0,2)5(0,3)6(2,3)7(1,2)8(4,5)9并查集:0 01 12 23 34 45 5算法步骤:对图的存储结构,按照权值,从小到大排序。对并查集进行初...原创 2019-11-20 13:12:20 · 357 阅读 · 0 评论 -
数塔问题
#include <bits/stdc++.h>using namespace std;static int dp[10][10];int main(void){ int n; cin >> n; for (int i = 1;i <= n;i++)for (int j = 1;j <= i;j++)cin >> dp[i][j]...原创 2019-11-15 18:33:03 · 157 阅读 · 0 评论 -
110. 平衡二叉树
class Solution {public: bool isBalanced(TreeNode* root) { return p(root)!=-1; } int p(TreeNode* root){ if(root==NULL)return 0; int l=p(root->left); ...原创 2019-11-13 20:32:53 · 91 阅读 · 0 评论 -
160. 相交链表
class Solution {public: ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) { auto la = headA, lb = headB; while (la != lb) { if (la)la = la->next; else la = headB; if...原创 2019-11-12 11:12:07 · 63 阅读 · 0 评论 -
0/1背包 动态规划
https://blog.csdn.net/qq_38410730/article/details/81667885商品体积w =1,2,3,4价值v =4,6,5,7背包容量bagv= 8#include<bits/stdc++.h>using namespace std;int main(void){ int w[5] = { 0,1,2,3,4 }, v[5]...原创 2019-11-11 16:21:53 · 132 阅读 · 1 评论 -
高级数据结构——十字链表
十字链表多用于AOI(Area Of Interest),即同步当前实体所能看到的其他实体的数据。四叉树在场景中的应用,当主角周围的静态对象(场景物件等)非常多的时候,它比较合适,因为在场景初始化的时候就可以根据场景情况分配四叉树的子节点数,而在运行时,只用激活主角周围的节点。而十字链元素的动态增减,更加适合移动的对象,比如同步或者显示周围移动的玩家,怪物等。基本原理1.二维游戏中,一般都...原创 2019-11-08 21:13:10 · 629 阅读 · 0 评论 -
高级数据结构——四/八叉树
四叉树在游戏行业运用非常之多。比如大场景的物件动态加载,NPC动态加载等,只用显示玩家周围的对象,能非常有效的降低场景CPU和GPU消耗。四叉树的查找算法,通过遍历子节点只到找到与之相交的叶子节点,就不做记录了,在这里将玩家移动时,周围物件显示和隐藏的过程记录下来,以便日后能快速回忆。对于一个有很多物体的3D场景来说,渲染这个场景最简单的方式就是用一个List将这些物体进行存储,并送入GPU进行...原创 2019-11-08 20:33:02 · 1517 阅读 · 0 评论 -
高级数据结构——KD树(K-Dimension Tree)
何为KD树Kd-树是K-dimension tree的缩写,是对数据点在k维空间(如二维(x,y),三维(x,y,z),k维(x1,y,z…))中划分的一种数据结构,主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索)。本质上说,Kd-树就是一种平衡二叉树。所以它的增加,删除,查询时间复杂度都是logn首先必须搞清楚的是,k-d树是一种空间划分树,说白了,就是把整个空间划分为特定的几个...原创 2019-11-08 19:14:53 · 2801 阅读 · 0 评论 -
二叉树非递归前中后序遍历
先序遍历void preOrderS(Node* root){ stack<Node*> s; Node* p = root; while (p || !s.empty()) { while (p) { cout << p->data; s.push(p); p = p->left; } if (!s.empty()...原创 2019-11-08 15:46:03 · 141 阅读 · 0 评论 -
蓄水池抽样算法(Reservoir Sampling)
问题:给定很多很多很多的N个数据,如何在只遍历一次的情况下随机选出m个不重复的数据?这个场景强调了3件事:数据流长度N很大且不可知,所以不能一次性存入内存。时间复杂度为O(N)。随机选取m个数,每个数被选中的概率为m/N。第1点限制了不能直接取N内的m个随机数,然后按索引取出数据。第2点限制了不能先遍历一遍,然后分块存储数据,再随机选取。第3点是数据选取绝对随机的保证。...原创 2019-11-05 21:20:15 · 329 阅读 · 0 评论 -
链表快排
利用快速排序的思想:设待排序数组为a,设两个指针i,j,其中i=a[i],j=i+1,之后我们把i指向的元素为枢轴。具体算法如下:如果 j 指向的值大于等于基准数字(如果比基准大,直接跳过)j ++如果 j 指向的值小于基准数字,(如果比基准小,交换 i 和 j 位置的值)i ++swap(i, j)j ++例子以a=[4,2,5,3,7,9,0,1]为例,我们来模拟一趟快...原创 2019-11-04 21:12:11 · 231 阅读 · 0 评论 -
一年中的第几天
对于要求输入的是整形的题即可用下面的C++版本#include <bits/stdc++.h>using namespace std;int main(void){ int y, m, d, num[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 }, da = 0; cin >> y >> m >&...原创 2019-11-04 20:14:41 · 335 阅读 · 0 评论