摘要:
题目:给定一个无序的数组,返回其中最长递增子序列的长度。解法:利用一个辅助数组1,记录每个长度的LIS的结尾字符,最后其长度就是所求值;辅助数组2,与1同步变化,记录数组1中每个元素在输入序列中的原始下标;辅助数组3,与输入数组等长,记录每个元素在一个LIS中的前驱下标。代码: 1 int binS... 阅读全文
摘要:
参考:C++ 模板详解(一)模板:对类型进行参数化的工具;通常有两种形式:函数模板:仅参数类型不同;类模板: 仅数据成员和成员函数类型不同。目的:让程序员编写与类型无关的代码。注意:模板的声明或定义只能在全局、命名空间、类范围内进行。即不能在局部范围、函数内进行,比如不能在main函数中声明或定义一... 阅读全文
摘要:
常见问题:①Top K问题:分治+Trie树/Hash_map+小顶堆。采用Hash(x)%M将原文件分割成小文件,如果小文件太大则继续Hash分割,直至可以放入内存。②重复问题:BitMap位图 或 Bloom Filter布隆过滤器 或 Hash_set集合。每个元素对应一个bit处理。③排序问... 阅读全文
摘要:
类成员函数指针:用于访问类成员函数,和一般函数指针有区别。类成员函数处理的是类数据成员,声明类成员函数指针的同时,还要指出具体是哪个类的函数指针才可以。调用时也要通过对象调用。而对于类的静态成员函数,它是类对象共享的,且只能处理静态数据成员,所以它的函数指针可以类似一般函数指针一样使用。 1 cla... 阅读全文
摘要:
参考:位操作基础篇之位操作全面总结位操作有6种基本操作符,按照优先级分别是:取反 ~移位 >与 &异或 ^或 |常用的用法有:1 判断偶数,判断最低位是0还是1即可,比求模快1 x % 2 != 0 //x正负都可以判断;不用x%2 == 1,因为如果x为负奇数,... 阅读全文
摘要:
先上概念,C++的多态性:系统在运行时根据对象类型,来确定调用哪个重载的成员函数的能力。多态性是通过虚函数实现的。成员函数之前加了virtual,即成为虚函数。有虚成员函数的类,编译器在其每个对象的开始处自动加一个指针,称为虚表指针,因为它指向一个表,称为虚函数表,表的元素是函数指针,指向该类的虚成... 阅读全文
摘要:
C语言的显式/隐式类型转换,都有一个中间变量的存在,原数据的类型、内容都不变。以下代码,都用GCC编译。 1 #include 2 3 int main() 4 { 5 char c = 'a'; 6 printf("%d %d %d\n", c, sizeof(c), sizeo... 阅读全文
摘要:
转自:八大排序算法图文讲解排序算法可以分为内部排序和外部排序:1)内部排序是数据记录在内存中进行排序2)外部排序是因排序的数据很大,内存一次不能容纳全部的排序记录数据,在排序过程中需要访问外存常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序。本文将依... 阅读全文
摘要:
作用:实现C和C++混合编程。原理:C和C++编译器编译之后,函数名会编译成不同的名字,链接阶段名字查找会找不到目标,后面实例中会详解。用法:①.c文件中定义的函数,.cpp文件要调用时,该.cpp文件中要用extern "C"声明该函数;②反过来,.cpp文件中定义的函数,.c文件要调用,则同样要... 阅读全文
摘要:
转自:阮一峰的网络日志 —— 字符串匹配的KMP算法字符串匹配的KMP算法字符串匹配是计算机的基本任务之一。举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?许多算法可以完成这个任务,Knuth-Morris-Pratt算... 阅读全文
摘要:
题目:给定一棵二叉树,结点的距离就是两个结点之间路径包含的结点的数目,求结点的最大距离。可以参考这两篇文章:《编程之美: 求二叉树中节点的最大距离》的另一个解法和Tree Diameter思路:在每一个结点处,求两个信息:以该结点为根的树的高度,以及以该结点为根的树中包含的最大距离。因为所求的最大距... 阅读全文
摘要:
何海涛博客:二叉查找树变为排序的双向链表思路:递归。如果根为空,则直接返回;先转换左子树,转换成功,则把左子树转换成的链表最后一个节点和根连接;再转换右子树,把转换后的链表第一个节点和根连接;最后返回链表头/尾节点。 1 struct TreeNode 2 { 3 int val; 4 ... 阅读全文
摘要:
参考July博客:最大连续子序列乘积先考虑不连续的思路:一维动态规划 考虑到乘积子序列中有正有负也还可能有0,可以把问题简化成这样:数组中找一个子序列,使得它的乘积最大;同时找一个子序列,使得它的乘积最小(负数的情况)。虽然只要一个最大积,但由于负数的存在,也要记录最小乘积。碰到一个新的负数元素时... 阅读全文
摘要:
过程:从右往左,找到第一个A[i] A[i], j > i;交换A[i] 与 A[j];将A[i + 1]之后的元素逆序(这里的i,j都是下标)。代码: 1 class Solution { 2 public: 3 void nextPermutation(vector &num) { 4... 阅读全文
摘要:
普通的归并排序,需要一个额外的数组来保存每次merge的结果;如果要求不使用额外空间,那么每次merge的时候需要做一些处理。思路:合并left[] 和 right[]时,假如right[0]应该放入left[3],那么:①可以用一个var来保存right[0],然后将left[3]之后的元素右移一... 阅读全文
摘要:
题目:给出一个链表中的两个指针p1和p2,将其之间的结点翻转。思路:可以通过交换结点内的值来实现结点的翻转,空间为O(N);如果要求不能交换值,那么仅凭p1和p2是无法翻转的,因为不知道p1之前的节点,会掉链,只能翻转p1之后的链表,这个过程就类似于给定一个头节点,翻转之后的链表了;可以使用头插法。... 阅读全文
摘要:
剑指offer中有这道题,何海涛博客:数组中出现次数超过一半的数字题目:给定一个数组,数组中有一个数字出现的次数超过数组长度的一半,找出这个数字。思路:先排序,再遍历,统计次数,时间O(N * lgN)。哈希表:统计每个元素次数,当数据分散时消耗空间大。快排的Partition,判断pviot是不是... 阅读全文
摘要:
二叉树的创建。这里采用最简单的情况,创建完全二叉树,用数组来保存: 1 struct TreeNode 2 { 3 int val; 4 TreeNode *left, *right; 5 TreeNode(int x): val(x), left(NULL), right(... 阅读全文
摘要:
几个基本的线程函数:(本人有强迫症,为了分清返回值、函数名、参数列表,间距有点大,用的时候不要这样)线程操纵函数1 int pthread_create (pthread_t *tidp, const pthread_attr_t *attr, (void*)(*start_rtn)(void ... 阅读全文
摘要:
看到有一个博客讲的比平时理解的更深入,mark一下:strcpy函数的实现这里只写平时理解的,三个要点: 1 //strcpy自己实现 2 3 char *strcpy(char *dest, const char *src) 4 { 5 assert(dest != NULL && sr... 阅读全文