自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 资源 (5)
  • 收藏
  • 关注

原创 c++和java的多态性的区别

java的多态性:java的多态性要满足三个条件:1、继承关系;2、在子类重写父类的函数;3、父类引用指向子类对象,即 animal p=new dog();c++的多态性:c++的多态性要满足三个条件:1、继承关系;2、父类函数有virtual关键字,在子类重写父类的函数;3、父类指针指向子类对象,即 animal *p=new dog(); 或 dog d; animal *p=&d;

2015-01-27 00:49:35 1023

转载 【DP】捡硬币游戏里先下手的队员最多能拿几分

题目:EPIint pick_up_coins_core(const vector &A, const int a, const int b, vector> &table){ if (a > b) return 0; if (table[a][b] == -1) { //假设选手S是理智的,他的选择总是让选手F的收益尽可能小,所以下面res1和res2的计算使用min

2015-01-25 16:38:46 529

转载 【DP】在矩阵中,选择一条从左上角到右下角、经过数字之和最大的路径

题目:EPIint max_fishing(vector> A){ if (A.empty() || A[0].empty()) throw new exception; for (int i = 0; i < A.size(); i++) { for (int j = 0; j < A[i].size(); j++) { int count1 = i - 1

2015-01-25 15:38:51 2313

转载 【经典】【DP】计算得分的排列方式和组合方式

题目:EPI巧妙利用动态规划的题目。//得到分数k的组合方式int count_combination(const int k, const vector &W){ if (W.empty()) return -1; vector combination(k + 1, 0); combination[0] = 1;//一种方式达到0 for (int i = 0;

2015-01-25 15:04:57 894

转载 【DP】判断在矩阵A中是否存在一条路径与数组s相同

题目:EPI提示:利用递归,且为了避免做重复工作,应该保存每一个查找失败的查询工作——实际上就是动态规划的思想。class comparestr{public: int i,j,k; comparestr(int ii,int jj,int kk):i(ii),j(jj),k(kk){} const bool operator==(const comparestr &a)

2015-01-23 13:44:18 562

原创 【难】【DP】计算bool矩阵中,仅包含1的最大矩形和最大正方形

题目:EPIclass record{public: int right;//如果一个点是1,则记录该点右边有多少个连续的1(包括该点本身) int down;//如果一个点是1,则记录该点下边有多少个连续的1(包括该点本身) record(){} record(int r,int d):right(r),down(d){}};//计算最大矩形区域int find_

2015-01-23 10:45:12 2045

转载 【难】【DP】计算“skyline”下的最大矩形面积

题目:EPIint calculate_largest_rectangle(const vector &A){ if (A.empty()) return -1; stack s; vector left(A.size()); vector right(A.size()); //计算左边边界 for (int i = 0; i < A.size(); i++) {

2015-01-22 22:37:15 969

转载 【难】【分治法】【树】求树中长度最大的路径

题目:EPI//由于题目的特殊要求,不树的节点需要数据域//pair的first是孩子节点,second是距离class TreeNode{public: vector, double>> edges;};//最大高度和最大直径pair find_diameter_core(const shared_ptr &root){ if (root->edges.empt

2015-01-22 12:15:33 695

原创 【分治法】在数组A中,返回i<j,且A[i]>A[j]的(i,j)配对的数量

题目:EPI在本题中,把数组分成左右两部分,分别计算左右两部分的invrted pair的数量,再计算A[i] 和 A[j]一边一个的情况,然后把三者相加。int count_invert_core(vector &arr,int begin,int end){ if (end - begin + 1 < 2) return 0; if (end - begin + 1

2015-01-21 22:34:04 1221

转载 【哈希表】设计client类,实现插入、删除、addAll(全体增减)、max()等操作

题目:EPI参考【哈希表】用O(1)时间执行哈希表的setAll操作(即把所有值置为一个统一值)同样是需要设置一个全局偏移量,才能在O(1)时间完成setAll操作class client{public: int offset;//全局偏移量 unordered_map M;//尽量用unordered容器 map> M_credit;//为了max()在O(1)时间

2015-01-21 12:32:18 529

转载 【数学】从上往下看,打印数轴上看到的颜色

题目:EPI//把Endpoint和LineSegment分开,是为了点的排序class Endpoint{public: bool Isleft; LineSegment* L; Endpoint(bool isleft, LineSegment* line) :Isleft(isleft), L(line){} const bool operator<(const E

2015-01-21 11:38:51 570

转载 【数学】找出若干个有序数组的最小距离

题目:EPI题目中要求的是三个有序数组,代码里扩展成k个有序数组,其中k是函数输入的数组的size。题目的意思可简化为:从A中的每个数组里选出一个数,则一共有k个数。这k个数从小到大排序(存放在set里,其实就是排序了),设最大的数减去最小的数,值为distance。我们要做的就是令distance尽可能小。所以每次更新res时,就需要把k个数中的最小值变大(即在其数组中右移一位)

2015-01-18 19:26:03 978

原创 【BST】在搜索二叉树中,寻找节点数据域在[L,U]范围内的节点

题目:EPI书上代码的思路是:由于BST的中序遍历的节点是按照升序排列的,所以先找到第一个(按照中序遍历的顺序)大于等于L的节点,然后依次找出这个节点的后继节点中,落在范围[L,U]的节点。但有一个问题就是,如果二叉树节点没有指向父节点的指针域,这个方法就不可取。何况题目没有要求返回的节点要按照升序排列。所以我写出以下代码,不需要二叉树节点有指向父节点的指针,返回的结果在[L,U]

2015-01-18 14:22:32 1531

原创 【BST】判断节点r和s是不是一个为祖先,另一个为后代

题目:EPI书上的代码我认为有错。我的代码如下所示,时间复杂度为O(h),h为二叉树的高度。//该函数不允许r和s为nullptr,且要求r、m、s三个指针互不相等bool is_r_s_descendant_and_ancestor(shared_ptr r, shared_ptr m, shared_ptr s){ if (m == nullptr || r == nul

2015-01-18 13:37:41 1698

转载 【二叉树】寻找二叉树/BST的两个节点的最低公共祖先

题目:EPI以下解法要求a,b节点必须在树内。shared_ptr LCA(const shared_ptr &root, const shared_ptr &a, const shared_ptr &b){ if (root == nullptr || a == nullptr || b == nullptr) return nullptr; if (root == a

2015-01-18 11:43:00 712

转载 【BST】根据前序遍历的数组构造搜索二叉树

题目:EPI方法一:时间复杂度O(nlogn)方法二:时间复杂度O(n)

2015-01-17 22:54:19 708

转载 【BST】返回搜索二叉树最大的k个数

题目:EPI依然用递归的方式解决问题:void find_largest_k_numbers_core(const shared_ptr &root, const int k, vector &res){ if (root && res.size() < k) { //右边的数字比较大,所以先处理右子树的元素 find_largest_k_numbers_core(r

2015-01-17 22:08:53 1226

转载 【BST】把两棵BST合并成一棵高度平衡的BST

题目:EPIclass treenode{public: int data; shared_ptr left, right; treenode(int d) :data(d), left(nullptr), right(nullptr){} treenode(int d, shared_ptr &l, shared_ptr &r) :data(d), left(l), ri

2015-01-17 17:51:01 1084

转载 【BST】把搜索二叉树转化成双链表

题目:EPI提示:用递归方式求解,思路比较简单清晰!typedef shared_ptr pnode;pair covert_BST_to_doublelist_core(const pnode &root){ if (!root) return pair(nullptr, nullptr); if (!root->left && !root->right) re

2015-01-17 14:51:34 1268

转载 【BST】找出有重复值的BST中值为key的第一个节点

题目:EPI分别用递归和迭代两种方式完成:

2015-01-17 00:16:49 1328

转载 【难】【BET】无重复值的搜索二叉树的插入和删除操作

题目:EPIclass treenode{public: int data; shared_ptr left, right; treenode(int d) :data(d), left(nullptr), right(nullptr){} treenode(int d, shared_ptr &l, shared_ptr &r) :data(d), left(l), ri

2015-01-16 23:50:11 558

转载 【二叉树】寻找一个二叉树的节点在中序遍历中的后继节点

题目:EPI提示:分成有没有右子树两种情况。在没有右子树时,注意向“上”查找时的正确方法。代码如下:

2015-01-16 13:09:07 685

原创 【map】【unordered_map】map和unordered_map中键类型为自定义类型的操作

STL中map的底层为红黑树,所以查找的时间复杂度为O(logn)。unordered_map是根据哈希值(遇到哈希值相同时用==号比较)寻找键,所以时间复杂度为O(1)。键类型为自定义类型时,map需要重载键类型的<符号,unordered_map需要定义键类型的哈希函数(在类外定义),以及重载键类型的==符号。

2015-01-16 11:21:31 1156

转载 【BST】判断一棵二叉树是否是搜索二叉树

题目:EPI方法一:递归方法,分别判断一个节点是否符合BST属性,然后递归判断其左孩子和右孩子。bool is_BST_core(const shared_ptr &root,const int &low,const int &up){ if(root==nullptr) return true; if(root->datadata>up) return false

2015-01-15 15:38:52 663

转载 【数字】【排序】判断数组对某一个数是否是“3-sum”

题目:EPI提示:先对数组排序,然后将“3-sum”问题转化为“2-sum”问题。

2015-01-15 13:24:57 451

原创 【数学】【排序】用最少的点,访问数组中的所有区间

题目:EPI  13.12我的代码与书上的代码略有不同,是从题目13.11 中得到的启发。方法是先把数组A排序,然后用一个变量cur记录当前已经遍历的区间的交集,cur初始化为A[0],从A[1]开始遍历数组,若当前遍历到的元素A[i] 与 cur有交集,则更新cur;若没有交集,则从cur中选一个点填入返回值res,然后cur=A[i]。typedef int TimeType;

2015-01-15 12:41:08 743

转载 【数学】【排序】对若干个区间进行合并

题目:EPI  13,.11typedef int TimeType;class Interval{public: TimeType left,right; bool isleftclosed,isrightclosed; Interval(const TimeType &a,const TimeType &b,const bool l,const bool r):lef

2015-01-15 11:19:52 1194

转载 【查找】找出两个数组共同拥有的元素

题目:EPI  13.5当n≈m时,时间复杂度O(n+m)//n≈mvector intersect_array1(const vector &A,const vector &B){ vector res; unsigned int i=0,j=0; while(i<A.size() && j<B.size()) { if(A[i]==B[j])//此处代码与书中不

2015-01-14 16:58:28 3352

转载 【查找】【位操作】数组中,除某一个数字x之外,其他数字都出现三次,而x出现一次,找出x

题目:EPI数组中,除某一个数字x之外,其他数字都出现三次,而x出现一次,找出x。推广一下,所有其他数字出现N(N>=2)次,而一个数字出现1次都可以用这种解法来推导出这个出现1次的数字。具体解析请看【白话经典算法系列之十七】 数组中只出现一次的数。

2015-01-14 13:01:22 657

转载 【查找】【异或】寻找两个集合的遗漏值和重复值

题目:EPI设题目中的遗漏值为m,重复值为t。方法一:先计算出t-m,然后计算t^2-m^2,进一步可得t+m。已知t-m和t+m,可求出答案。缺点是相加时有可能溢出。方法二:用异或来做。//该函数的功能是判断整数num转化为二进制时,第index位是不是1bool Is_some_bit_one(int num,int index){ int x=1

2015-01-14 12:25:53 1145

转载 【查找】【bitset】从十亿个IP地址的记录中,找出一个没有被记录的IP

题目:EPI  11.152^30约等于10亿,2^16 字节=1Mbyte.关于bitset类的介绍,见这里。

2015-01-14 11:04:37 1412

转载 【极难】【BFPRT算法】找到无序数组中最小的K个数

题目:来自脑客爱刷题题目:给定一个无序的整型数组arr,找到其中最小的k个数。方法一:时间复杂度O(N*logK)O(N*logK)的解法说起来非常简单,就是一直维护一个k个数的大根堆,这个堆代表目前选出的k个最小的数,在堆里的k个元素中堆顶的元素是最小的k个数里最大的那个。在遍历整个数组的过程中,看看当前数是否比堆顶元素小:如果是,就把堆顶的元素替换成当前的数,然后从

2015-01-13 13:15:59 961

转载 【unordered_map】在数组中找出包括某集合所有元素的最短子数组

题目:EPI搜狗实习生面试中出现过类似的题。那道题是“给出一个字符串,以及字符串中出现过的所有字符,找出一个最短子串,该字串包括出现过的所有字符”。

2015-01-10 13:11:02 1317

转载 【极难】【二分查找】返回两个数组中第k小的元素

题目:来自脑客爱刷题给定两个有序数组arr1和arr2作为两个输入参数,还有第三个输入参数为K,返回两个数组所有数中,第K小的数(K>=1)。例如:arr1 = {1,2,3,4,5};arr2 = {3,4,5};K = 5;返回4提示:FindMedianInTwoSortedArraySameLength_Core() 这个函数在上一篇中提到。in

2015-01-10 00:12:57 517

转载 【二分查找】找出两个长度相等的数组中所有值的 “上中位数”

题目:来自脑客爱刷题给定两个有序数组arr1和arr2,两个数组长度相等,求两个数组中所有数的中位数。注意,这里的中位数是指 “上中位数” ,不是取两个中间值的平均数,而是取两个中间值较小的那个。例如:arr1 = {1,2,3,4};arr2 = {3,4,5,6};返回3;int FindMedianInTwoSortedArraySameLength_Core

2015-01-09 22:33:09 1030

原创 【暴力枚举 哈希表】Max Points on a Line

涉及到的知识点:求最大公约数、两点确定一条直线的数学公式、unordered_map 和 unordered_set.

2015-01-08 23:51:51 732

转载 【哈希表】实现结构RandomPool,用O(1)时间完成插入、删除和随机返回的功能

题目:来自脑客爱刷题//假设key是double类型class RandomPool{public: //cur_index记录当前插入的次序,恰好也是哈希表中已有记录的个数 KeyToIndex.size() int cur_index; //维护两张哈希表 hash_map KeyToIndex; hash_map IndexToKey; //cur_index

2015-01-08 21:54:55 1100 1

转载 【哈希表】判断字符串M中的字符是否可以组成字符串L

题目:EPI提示:由于L肯定比M短,所以应该建立L的哈希表。L中的字符在M中出现一次,哈希表相应数值就减少一次,直到哈希表为空。bool anonymous_letter(const string &L, const string &M){ if (M.empty() || L.empty()) throw new exception("error"); hash_m

2015-01-08 21:20:24 610

原创 【位操作】通过位操作快速实现某些计算结果

判断是否偶数/基数:bool IsEven = num & 1 ==0?true:false;除以/乘以2:int res=num>>1;2的n次方:int num=1

2015-01-08 17:25:51 491

转载 【二分查找】求一个double型数据的平方根

题目:EPIint compare(double a,double b){ double diff=fabs(a-b); if(diff<1.0/100000000.0) return 0; else { return a>b?1:-1; }}double square_root(const double root){ if(compare(root,0)<0)

2015-01-08 16:35:53 2563 1

VC++程序: 将字符串转换成公式并计算结果

int Calculate(string formula) 函数功能:输入一个字符串公式string formula,允许四则混合运算,然后输入公式中对应变量的取值,最后返回int类型计算结果。 变量的格式:必须由1位字母加1位数字组成,如a1、b2等。 如输入字符串 “(a1+b2)/(-100)”,以及a1=100,b2=300,得到结果-4。遇到小数则向下取整。 公式的格式: 1、只包含变量、常数、四则符号、小括号四种符号,不支持大括号和中括号 2、允许正数前加正号,如+100 3、不允许空括号,如 “8*( )” 4、允许负数,但负数必须加括号,如 "5/(-1)"。当负数在公式开头时,可不加括号, 如 "-a1+90"和“+a1+90” 都是对的 5、允许纯常数公式,如 “5*(-9)” 6、允许用户输入多余的空格,但空格不能造成公式错误, 如公式 “(1 08+a2)/a 3” 是错的,(- 7)和(- n5)是错的,去掉空格就对了。

2014-10-23

求字符的所有排列

求字符的全排列,如输入三个字符a、b、c,则它们的组合有a,b,c,ab,ac,bc,abc。

2014-06-08

判断二叉搜索树的前序遍历

《剑指offer》面试题24的相关题目。输入一个整数数组,判断该数组是不是某二叉搜索树的前序遍历。假设输入的数组的任意两个数字互不相同。

2014-06-08

从上到下打印二叉树结点

用队列实现从上到下打印二叉树每个节点,同一层的节点按照从左到右的顺序打印。用C++实现。

2014-06-08

N皇后问题C++代码

N皇后问题C++代码

2014-06-07

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除