02 2020 档案
摘要:kmp算法中的经典,应用于字符串匹配的问题。 给定两个串:str="acbc" match=“bc” 返回2 str="acbc" match="bcc" 返回-1 本人水平有限只简单描述一下求...
阅读全文
摘要:Manacher解决的是最大回文子串的问题。 给定一个字符串str,返回str最长回文子串的长度。 比如:str1="123" 返回1 str2="abc1234321ab" 回文子串为“1234321”...
阅读全文
摘要:动态规划(0)-字符串的交错组成,二维表呈现的是,str1,str2 ,aim三个字符串的关系,那么本篇最长公共子串就是只是str1,str2两个字符串的关系。 问题:给定两个字符串,返回两个字符串的最长公共子串。 举例:str1="1AB2345CD",st...
阅读全文
摘要:动态规划一般分四种模型: 1.从左到右,例如背包问题。 2.范围上尝试的,L-R。 3.str1行,str2列,玩二维表,或者对应表。 4.随意试,用分支限界的方法来规定限制条件。 题目:给定三个字符 str1,str2,aim包含且仅包含来自str1,str...
阅读全文
摘要:已知某字符串只含有小写字母,压缩之后的字符串包括数字、大括号、小写字符 请根据str还原字符串并返回 例如:3{2{abc}} abcabcabcabcabc 3{a}2{bc}aaabcbc 3{a2...
阅读全文
摘要:输入一个字符:返回每个字符的个数 比如: 输入:"abc1111111111dajogpajogjao%%%%%$4jgcccaaAAAAEEEE1111111&&&&&&&&&&&&&&&&&&&&&"; 输出: map scount;//汉字 两字节 m...
阅读全文
摘要:1."dog loves pig " -> “pig loves dog" 思路:1.整体逆序 2.每个单词再逆回来。 coding: 1. reverse(str.begin(),str.end()) 2.s...
阅读全文
摘要:并查集提供两种操作: 1.查询a,b是否属于一个集合 bool issamset(V O1,V O2); 2.把a所在集合和b所在集合合并。操作的是元...
阅读全文
摘要:最小不可组成和:两种情况: 1.[min,max] 如果有一个数不能被某个子集得到,求:最小的那个数 arr[3,2,5] sum={2,3,5,5,7,8,10} 少{4,6,9} 返回4 2.[min,max] 如果都有,那么max+1是arr...
阅读全文
摘要:一个数的因子仅包含2,3,5的数称为丑数。 数字1特殊 是丑数,1-10 1、2、3、4、5、6、8、9、10、12.返回第N个丑数。 算法中,对于数字的处理很多都是存储其因子,而非值本身。 解法:1.暴力解:1.1 a=1 返回1 ...
阅读全文
摘要:题目:给定正整数,返回该数组能不能分成4部分,且每个部分累加和相等。切分位置的数不要。 比如:arr[]=[3,2,4,1,4,9,5,10,1,2,2] 返回 true 三个切割点下标为2,5,7.[3 2][1 4] [5] [1 2...
阅读全文
摘要:原问题: 已知两个数组arrx arry 表示二维平面上的点坐标 问一条线最多能穿过多少个点? 其实就是问,同一斜率上的最大点数。可以简单看出一组数据的状态。斜率计算公式 :d=y1-y2/x1-x2 用d...
阅读全文
摘要:给两有序数组ARR1 ARR2,返回两个相加和最大的前K个。 比如:arr1={1,2,3,4,5} arr2={3,5,7,9,11} K=4 ,则返回res={16,15,14,14} 思路:1.所有两两相加后排序,原始,暴力的方法。 ...
阅读全文
摘要:时间函数大家很熟了,但是发现在vs2019下,好用的ctime等函数编译不通过。何解? 因为不安全,全部替换成 类似于ctime_s这样的。 上代码:编译不通过 void test_time() { //1.程序启动时间 clock_t clock...
阅读全文
摘要:题目:给定一个非负整数数组,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度(步数)。 判断你是否能够到达最后一个位置。 输入:int arr[] = { 3,2,3,1,1,4 }; 输出...
阅读全文
摘要:字符判断中常有(),有效性判断就显得很重要。其实可以扩展到{}之类成对出现的符号的有效性。 str="()";str="(()())"; 返回true; str=“())” str="()a()" 返回false; 思路:1.左->右 遍历 判断每个字符是不...
阅读全文
摘要:给一个字符串,统计每个字符出现的次数。 比如“aabbbadddff” 输出a_2_b_3_a_1_d_3_f_2 思路:遍历一遍,当[i]==[i-1]时,num++;当不等时 组合字符,num=1; 编码: string->char ...
阅读全文
摘要:把整数字符串转换成整数值。分两部分。 1.判断字符串以下四种为无效。 1.1三种开头,以“_”长度为1; 1.2不以"_",也不以数字开头: 1.3“A12”;以0开头"023"; 1.4 每个字符 判断是否为数字 ‘9...
阅读全文
摘要:单链表结构如下:两个节点 对象指针。 class Noderand{public: int m_value; Noderand * next; Noderand * rand; Noderand(int value);};Noderand::Noder...
阅读全文
摘要:题目:有一个整型数组A,代表数值不同的纸牌排成一条线。玩家a和玩家b依次拿走每张纸牌,规定玩家a先拿,玩家b后拿,但是每个玩家每次只能拿走最左或最右的纸牌, 请返回最后获胜者的分数。 思路:暴力递归,典型的“范围”上尝试的模型 上代码 #include #in...
阅读全文
摘要:背包问题指这样一类问题,题意往往可以抽象成:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。 本文讲的是最基本的01背包问题。 有N件物品和一个容量为V的背包。第i件物品的费用(即体...
阅读全文
摘要:小朋友的益智玩具,就是把一些圈圈从a->移到c,小的在上面,大的在下面。问你怎么做。 下面是图解: 写成代码就是: 先上个好理解版本的代码 if(N==1) 为basecasevoid all(int N){ //开始位置:左->右 Left...
阅读全文
摘要:比如我有一个"abc" 那么全排列就是 abc acb bac bca cab cba, 如果是“aac”,那么就是 aac aca caa,而不是 aac aca aac aca caa caa. 递归:从左往右的模型。 C++...
阅读全文
摘要:1.与list相比就是可以有下标访问。.at(index)与[index]访问基本一样,只是.at(index)是有边界检查的。 2.remove ()并不删除元素,因为容器的size()没有变化 3.如果需要高效的存取操作,选择vector...
阅读全文
摘要:问题: 一块金条切成两半,是需要花费和长度数值一样的铜板的。比如 长度为20的 金条,不管切成长度多大的两半, 都要花费20个铜 板。一群人想整分整块金 条,怎么分最省铜板? 例如,给定数组{10,20,30},代表一共三个人, 整块金条长度为 10+...
阅读全文
摘要:花费和利润问题。要求花费最少,利润最大。 输入: 数组 costs,i号项目的花费 profits ,i号项目扣除花费后的利润 K 串行的最多的项目个数 ...
阅读全文
摘要:会议室安排 输入:一组会议的其实终止时间比如[7,8],[8,10],[9,12][10,15]..就一个会议室,如何安排会议室的利用率最高。 输出:安排会议的个数,或者是安排了哪些会议。此时返回3 ,[7 8][8 10][10 15] 思路:按结束...
阅读全文
摘要:与有序表、哈希表一样,队列实现的大小根堆也是分两种:内建数据和自定义对象数据。 1.内建数据大根堆 2.内建数据小根堆 greater 3. 自定义对象大根堆 4.自定义对象小根堆 重载 xxx 大根堆 priority_qu...
阅读全文
摘要:前缀树三个主要的函数: 1.添加word void insert(string word) ...
阅读全文
摘要:前缀树是处理字符串常见的数据结构。 前缀树一般包含四个功能:1.添加word void insert(string word) 2. 删除word void delete(...
阅读全文
摘要:对于前缀树,JAVA和C++编码不一样的在于节点删除。JAVA有JVM,对new的变量无需手动删除,而C++需手动删除动态分配的堆内存,也就是new delete 得成对出现。 C++ :必须遍历每个节点,手动释放空间,然后回到上级节点,再把...
阅读全文
摘要:C++-STL(4)-unordered_set-自定义类型讲的自定义对象中的成员变量是基础数据类型。 本篇实现的是成员变量是自定义对象, key值为自定义对象指针。 注意点:1.创建:重载=,重载()(rc.m_value) ^ hash()(rc.next...
阅读全文
摘要:C++-STL(8)-unordered_map讲的自定义对象中的成员变量是基础数据类型。 本篇实现的是成员变量是自定义对象, key值为自定义对象指针。注意点:1.创建:重载=,重载()(rc.m_value) ^ hash()(rc.next); } };...
阅读全文
摘要:map中如果要存的是结构体指针怎么做?创建时:要重载 #include using namespace std; struct Key{ int x, y; bool operator==( const Key& b) const //需要重载==才能find...
阅读全文
摘要:链表:缺点 :无法访问位置 没有Index的概念。数组可以[index]. 优点:在序列已知的任何位置插入或删除元素。可以合并、去重、交换。 一样的增删改查上代码 void listtest(){ cout strlist" st...
阅读全文
摘要:1.哈希表 哈希表可以理解为一个K,V数据库,是一种集合结构。 1.有key,无value :JAVA 用HashSet,C++用UnOrderedSet 2.有key,有value:JAVA用 HashMap,C++用UnOrder...
阅读全文
摘要:比链表的合并去重更容易实现。直接上代码,供各位参考。 去重方法:1.用vector vc保存新数组值时:对于有序数组, 新加的数!=数组的最后一个数 2.用setintset;保存自然去重 1.vector //合并两...
阅读全文
摘要:本篇 自定义对象:Rect里的成员变量都是基础数据类型。 下篇 C++-STL(9)-unordered_map-自定义类型(2)-实例源码 成员变量是自定义对象 基础数据类型、自定义对象类型相比: 1.定义:unordered_map rectmap;...
阅读全文
摘要:自定义类型一般有三种实现方式,百度一下就出来了。目的都是重写hash 以及 equal。 其实都是三步走: 1.自定义对象; 2.重载operator; 3,哈希函数 本文给出两种好用的,一个是struct的,...
阅读全文
摘要:暴力递归就是把所有的可能性都做一遍,比如全排列,最朴素的自然智慧。 打印一个字符串的所有子集。比如“abc”,子集就是 a,b,c,ab,bc,abc. 递归实现。 实例注意事项:传递的是引用。 本例new a...
阅读全文
摘要:给定一个string 字符串strArr,和一个char字符c,返回c在strArr中出现的个数。 用一个map记录字符和出现的次数。谈不上什么算法,基本就是coding. 1.char c=strArr[i]: //类型转换s...
阅读全文
摘要:思路:在K位置增加节点,你要找的是k-1这个点。上代码。 Node* addNode(Node* head, int Kth, int m_val){ Node* pre = head; Node* cur = head->next; Node* newn...
阅读全文
摘要:在时间区间中插入一个新的时间区间(如果有重叠的话就合并区间)。 这些时间区间初始是根据它们的开始时间排序的。 以数组为例:给定时间区间[1,3],[6,9],在这两个时间区间中插入时间区间[2,5],并将它与原有的时间区间合并,变成[1,5],[6...
阅读全文
摘要:merge单链表。 例如:head1:0->2->3->7 list2:1->3->5->7->9 结果:0->1->2->3->3->5->7->7->9 class Node{public: int m_value; Node* ...
阅读全文
摘要:冒泡、插入、选择是三种基本的比较排序算法,时间复杂度基本是O(n^2).冒泡 //冒泡:O(n^2) 值 排序 空间也是O(1) 稳定 //1. 5位置OK 操作N-1次 两两比较 大的交换位置 一次遍历得一个最大值 //...
阅读全文
摘要:给定一个单链表head和一个值num,删除链表中值为num的值。 比如1->2->3->4->5->null,num=3 删后即为:1->2->4->5.基本就一coding问题。 思路:用容器将不等于num的节点收集起来再连起来。 ...
阅读全文
摘要:应用中对于系统函数,比如sort,默认是从小到大的排序,现在我想让它从大到小的排序,我该怎么做呢? 或者我有一组对象,学生类,有学号、年龄、分数等属性,我一会想按学号排,一会想按年龄排,一会想按分数排,如何做呢?比较器或者叫运算符重载就派上...
阅读全文
摘要:我写了一个算法,怎么知道我写的对不对呢?思路就是:对比,一个我写的,一个是绝对正确的,然后两个对比即可。 //1 最大测试次数//2.最大值 最小值//3.选择排序//4.对数器//5.如果相等,打印main(string[] args){ in...
阅读全文
摘要:与set map 比,unordered_set-unordered_map底层是哈希hash,也就是无序。 内建数据类型:比如int ,string这样。 本篇代码实例为unordered_set-unordered_map。 set,map有序参看前篇 C...
阅读全文
摘要:map key 不同,value可同,有序。 set key不同 , 有序 。 用于整数去重排序最好不过了。不能改值。 代码亲测可行,自己MARK一下,也供大家参考。 map void ma...
阅读全文
摘要:快排在排序中的名声如雷贯耳。其实就是在L-R上随机取一个数作为划分值,然后分三个区域,大于,小于,等于区域,在大于、小于区域上分别做递归排序。就是荷兰国旗的拓展。如果懂了荷兰国旗,这个就是小菜一碟。 三步: 1.L-R不能越界 2.L-R位置中 等...
阅读全文
摘要:冒泡、插入、选择三种排序已经说过。本文上的是亲测可行的C++代码,供大家参考。冒泡 void bubbleSort(int arr[],int m_num){ cout 0; e--)//操作次数 所以(0,len-1] { for (int i=...
阅读全文
摘要:单链表,双向链表实现逆序,C++代码,供大家参考。 一般Node用struct定义,我这用的class. void reverseList_main()为主函数。 class Node {public: int m_value; Node *next; //构...
阅读全文
摘要:与荷兰国旗相比,归并主要是二分。 1.分左右,[left-mid],[mid+1,right], 2.两边Merge,就是分别取数,比小后放入辅助数组中,以上两步不停递归, 3.basecase为left==right,最后完成排序。 ...
阅读全文
摘要:堆,逻辑上是一个完全二叉树,实现是一个数组。时间复杂度O(N*logN)。二叉树的高度就决定了O(logn)这个结论。 堆两个操作:1.heapInsert() 加一个新值到堆里 ,值与父比,如果大则交换位置。 2....
阅读全文
摘要:堆,逻辑上是一个完全二叉树,实现是一个数组。时间复杂度O(N*logN)。二叉树的高度就决定了O(logn)这个结论。 堆两个操作:1.heapInsert() 加一个新值到堆里 ,值与父比,如果大则交换位置。 ...
阅读全文
摘要:应用中对于系统函数,比如sort,默认是从小到大的排序,现在我想让它从大到小的排序,我该怎么做呢? 或者我有一组对象,学生,有学号、年龄、分数等属性,我一会想按学号排,一会想按年龄排,一会想按分数排,如何做呢?JAVA中叫比较器,C++中叫...
阅读全文
摘要:把一个数组分为三个部分,像荷兰的三色旗一样。分别为>、=、p右边// 返回值:长度为2的数组,区域的左边界,右边界//如果无等 返回值 左>右// 区下标 more, index 当前位置下标int[] partition(int[] arr,int L...
阅读全文
摘要:写了一个算法,我怎么验证我的算法对不对呢?写个小程序测试一下。这就是对数器。 过程基本就是四步: 1.设定测试次数 2.测试输入:2.1产生随机数组 数值范围 数值个数范围 2.2copy出来一份,内存地址不一样...
阅读全文
摘要:冒泡、选择、插入、堆排、归并、荷兰国旗、快排等都是基于比较的排序。桶排是根据数据状况做的计数排序,在range少,比如年龄(1-200),数据多的时候非常好用。如果你理解词频统计,那么就能理解什么是桶排。时间复杂度为O(N)。 步骤: 1....
阅读全文

浙公网安备 33010602011771号