- 博客(17)
- 收藏
- 关注
原创 C++ STL中常见容器用法
记录下常用的标准库的操作。容器主要分为顺序容器和关联容器,每个大类中的容器操作都大同小异,所以分为这两大类及记录。顺序容器常用的顺序容器有vector, deque, list, string等(当然还有array)。常用操作定义和初始化C c; //定义一个空容器。如果是array,其中的元素会进行默认初始化。C c1(c2); //用c2来初始化c1C c1=...
2020-04-25 22:06:10
354
原创 卡牌分组与最大公约数
题目给定一副牌,每张牌上都写着一个整数。此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组或更多组:每组都有X张牌。组内所有的牌上都写着相同的整数。仅当你可选的 X >= 2 时返回true。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-c...
2020-04-25 14:14:10
136
原创 找二叉搜索树指定节点的下一个节点
题目设计一个算法,找出二叉搜索树中指定节点的“下一个”节点(也即中序后继)。如果指定节点没有对应的“下一个”节点,则返回null。思路对于一个节点考虑两种情况:1. 指定节点大于等于本节点,那要找的一定在右子树。2. 指定节点比本节点小,要找的节点在左子树或者是本节点。代码 TreeNode* inorderSuccessor(TreeNode* root, Tr...
2020-04-24 00:47:21
373
原创 寻找二叉树的最近公共祖先
题目给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/er-cha-shu-de-zui-...
2020-04-16 21:27:03
361
原创 快排
思路选取第一个数,比它小的放左边,比它大的放右边,递归地处理左右两边的数组就能完成快排。关键在于如何原地将数组分为两块:保存第一个数为cur,这时第一个位置(low)空了出来,用指针high指向最右,指针low指向最左,high从右往左找到第一个比cur小的放到low(此时high位置空出),low再从左往右找到第一个比cur大的放到high,这样循环到low==high。代码#in...
2020-04-15 11:34:37
226
原创 求一个集合的全部子集
思路对于集合中的每一个数递归地考虑两种情况,拿或者不拿。代码#include"stdafx.h"#include<vector>#include<set>#include<iostream>#include<string>#include<math.h>#include<algorithm>usin...
2020-04-15 11:24:17
174
原创 找出树的最大路径
树的最大路径为节点值和为最大的路径。思路节点值为实数。对于一个节点,当前的最大路径需要考虑四种情况:自己,自己加左子树,自己加右子树,自己加左右子树。但一个节点能返回给上一个节点的路径只有三种情况:自己,自己加左子树,自己加右子树(因为加左右子树的加上父节点就不是一个路径了)。代码#include"stdafx.h"#include<vector>#include...
2020-04-14 18:19:50
827
原创 堆排序
思路堆是以数组存储的,但它的逻辑结构是一个完全二叉树,且父节点一定大于它的子节点(大顶堆,小的反之亦然)。堆排序首先需要在数组上建立堆,即从len/2(最后一个非叶子节点)开始往前遍历,如果子节点比自己大就交换并且要继续往下调整(可能子节点的子节点也比自己大)。建立完堆后,输出第一个数就是最大的,再把最后一个数放到第一的位置,重新调整堆。对于插入,可以将一个数放到数组最后,并改用自...
2020-04-14 18:00:01
102
原创 旋转数组
生成旋转数组假设需要将{1,2,3,4,5}左移2位生成{3,4,5,1,2}。可以将整个数组反转{5,4,3,2,1},再将后k个数,即2个反转,前n-k个数,即5-2=3个数反转,{3,4,5,1,2}。基于非递减旋转数组的二分查找对于数组a,low指向最低位,high指向最高位,mid=(low+high)/2。情况1:a[mid]<a[high],说明mid位于右边的...
2020-04-13 15:05:34
65
原创 用两个栈来模拟队列
题目用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路push操作都push到栈1中。当要进行pop操作时,如果栈2是空,就把栈1所有元素pop出来并按pop顺序push到栈2中,就实现了先进的元素在栈顶,如果栈2不为空就直接pop栈2,因为栈2顶部就是先进的元素。代码class Solution{public: void p...
2020-04-13 12:49:29
201
原创 重建二叉树
题目输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路根据前序遍历可知根节点,根据中序遍历可知根节点的左右子树,递归地对左右子树进行同样的操作就能建立。代码/** * Definitio...
2020-04-13 12:42:44
77
原创 KMP算法笔记
建立next数组直观来看,next[i]就表示模式串匹配到i时没成功应该从哪一位重新匹配。所以只用看i前面的字符串和开头字符串有多少重复的,重复数加一就是next[i]的值(模式串下标从1开始)。要遍历整个模式串,时间复杂度O(n)。代码void get_next(char T[], int next[]) [ int i=1; int j=0; nex...
2020-04-13 12:01:35
102
原创 简单题集合
题目请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思路先计算有多少空格,就能知道最终字符串长度。为了防止覆盖后面的字符,从后往前遍历遇到空格就将空格替换成%20。代码void replaceSpace(char *str,int length) { ...
2020-04-12 23:28:54
229
原创 有序二维数组查找
唉,做过的题没有思考就忘了,今天起把刷的题都记个笔记好了。有序二维数组查找在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路一:对每一行进行二分查找时间复杂度O(nlogn)思路二:依题意可以看出,对于一个数,向上是递减,向右是递...
2020-04-12 23:03:57
162
原创 背包问题总结
看了很多别人写的文章,准备记点简单的笔记。01背包物品价值v重量w,每种只有一个,求容量一定的背包能装的最大价值。用f[k][v]表示处理了前k个物品(拿或不拿)后容量为v的背包最多能拿多少价值。因为对于物品i,f[k][v]=max{f[k-1][v], f[k-1][v-w[i]]+v[i]}只考虑前一个状态,所以可以用一维数组来记录状态,从前0个物品往下遍历到最后一个物品,但...
2020-04-10 17:52:05
120
原创 C++中模板的编译过程
C++分离式编译就我最常用的vs来说,对于每个cpp都是独立编译再进行链接的。而为了保证一个cpp能调用另一个cpp而不会导致另一个被编译两次(include另一个文件会在预处理时展开并参与编译),一般都会将类和函数的声明写在h文件中并在cpp中include。所以一般的类和函数都会在编译时确定它的声明但没有定义,会留到链接时与其他文件中的定义进行链接。模板的问题所以根据分离式编译,模...
2020-04-10 16:00:50
1600
原创 跳台阶
算法笔记——跳台阶又是一道见过的题,想不起来做法,所以决定开始做下笔记。题目一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法思路台阶数为1,2,3时能很快算出跳法为1,2,3。之后只需要递归地将n阶分为两种情况来考虑,即最后一步是跳两级还是跳一级。比如现在算n=4,如果我最后一次跳两级,即前面的两个台阶的跳法和n=2时一样,如果我最后一次跳一级,即...
2020-04-05 15:45:43
84
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人