![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
多云的夏天
读小说一样读代码
展开
-
C++-算法(80)-单链表与双链表的反转(逆序)
链表反转或者叫逆序是常用操作,网上有很多图文共有的说明文章,方法也多种多样。 其实我的理解,单链表赋值是对node->next 而非node ,而双向链表是对 node->last 和node->next的操作。 无论是单向链表还是双向的,都是三步: 1.记录当前Node位置 2.交换 3.当前node后移单向链表:class ListNod...原创 2020-04-02 16:56:39 · 430 阅读 · 0 评论 -
算法-C++STL-栈stack与队列queue
栈(Stack)和队列(Queue)是两种操作受限的线性表。(线性表:线性表是一种线性结构,它是一个含有n≥0个结点的有限序列,同一个线性表中的数据元素数据类型相同并且满足“一对一”的逻辑关系。栈 stack<> 表尾push 表头删;入栈: s.push(x);将x添加到 栈中(添加到栈顶)。出栈: s.to...原创 2020-04-07 06:20:47 · 184 阅读 · 0 评论 -
算法-(1)-整数因子分解
大于1的正整数 n 都可以分解为 n = x1 * x2 * ... * xm 例如:当n=8时,共有8种不同的分解式: 8 =8 8 = 4*2 8 = 2*2*2 8 = 2*4 1int count = 1;void Account(int num){ for (int i = num - 1; i >= 2; i--) if (num % i == ...原创 2021-03-29 10:09:03 · 167 阅读 · 0 评论 -
算法-Manacher-C++
给定一个字符串str,返回str最长回文子串的长度。比如:str1="123" 返回1 str2="abc1234321ab" 回文子串为“1234321”,返回7原创 2020-02-26 22:02:08 · 258 阅读 · 0 评论 -
算法-动态规划(4)最长公共子串-C++
动态规划(0)-字符串的交错组成,二维表呈现的是,str1,str2 ,aim三个字符串的关系,那么本篇最长公共子串就是只是str1,str2两个字符串的关系。问题:给定两个字符串,返回两个字符串的最长公共子串。举例:str1="1AB2345CD",str2="12345EF",返回“2345”思路:dp[][] 表示 把str1[i]和str2[j] 当作公共子串最后一个字符时,公共子串...原创 2020-02-21 06:19:50 · 990 阅读 · 0 评论 -
C++-STL(15)-词频统计
1.“aaaabbbbccccdddssss”每个字符出现的次数2.“aaaaa4444444444AAAAAAAAAAAA”输入一行字符,分别统计出包含英文字母、空格、数字和其它字符的个数。/***统计出英文字母字符的个数。**@paramstr需要输入的字符串*@return英文字母的个数*/publi...原创 2020-02-18 18:44:28 · 343 阅读 · 0 评论 -
算法(50)-并查集(1)-C++
并查集提供两种操作: 1.查询a,b是否属于一个集合 bool issamset(V O1,V O2); 2.把a所在集合和b所在集合合并。操作的是元素,合并的是元素所在的集合。union(V O1,V O2);template <class V>class Eleme...原创 2020-02-17 17:57:24 · 171 阅读 · 0 评论 -
算法-KMP-C++
一个字符串 “abc123def” 找子字符串。1.暴力方法:原创 2020-02-26 22:02:52 · 118 阅读 · 0 评论 -
算法(52)-并查集(3)-岛问题-C++
并查集提供两种操作: 1.查询a,b是否属于一个集合 bool issamset(V O1,V O2); 2.把a所在集合和b所在集合合并。操作的是元素,合并的是元素所在的集合。union(V O1,V O2);...原创 2021-03-29 10:11:26 · 132 阅读 · 0 评论 -
算法(46)-递归-压缩字符串-C++
已知某字符串只含有小写字母,压缩之后的字符串包括数字、大括号、小写字符 请根据str还原字符串并返回例如:3{2{abc}} abcabcabcabcabc 3{a}2{bc}aaabcbc 3{a2{c}}accaccacc这是嵌套结构的典型递归模型string getTimesString(int times, string ...原创 2020-02-18 23:18:13 · 294 阅读 · 1 评论 -
算法(44)-动态规划(3)-背包-最小不可组成和-C++
最小不可组成和:原创 2020-02-14 20:24:12 · 183 阅读 · 0 评论 -
算法(43)-动态规划(2)-丑数-C++
一个数的因子仅包含2,3,5的数称为丑数。数字1特殊 是丑数,1-10 1、2、3、4、5、6、8、9、10、12.返回第N个丑数。思路:暴力解算法中,对于数字的处理很多都是存储其因子,而非值本身。暴力解:1.a=1 返回1 2. 输入A 依次消 因子 2 得b;消 3得d;消5得e 如果e==1 则是丑数。...原创 2020-02-14 20:23:11 · 195 阅读 · 0 评论 -
算法(42)-数组等值切割-前缀累加和-哈希表Map-set版-C++
题目:给定正整数,返回该数组能不能分成4部分,且每个部分累加和相等。切分位置的数不要。比如:arr[]=[3,2,4,1,4,9,5,10,1,2,2] 返回 true 三个切割点下标为2,5,7.[3 2][1 4] [5] [1 2 2]思路:预处理结构技巧,前缀累加和模型。 哈希表。...原创 2020-02-14 20:23:01 · 231 阅读 · 0 评论 -
算法(41)-动态规划(0)-字符串交错组成-C++
动态规划一般分四种模型:1.从左到右,例如背包问题。2.范围上尝试的,L-R。3.str1行,str2列,玩二维表,或者对应表。4.随意试,用分支限界的方法来规定限制条件。题目:给定三个字符 str1,str2,aim包含且仅包含来自str1,str2的所有字符。str1="ab",str2="12".那么"AB12","A1B2","A12B","1A2B","1AB2"都是st...原创 2020-02-20 06:36:11 · 220 阅读 · 0 评论 -
算法(40)-直线斜率-C++
原问题:已知两个数组arrx arry 表示二维平面上的点坐标 问一条线最多能穿过多少个点? 其实就是问,同一斜率上的最大点数。可以简单看出一组数据的状态。斜率计算公式 :d=y1-y2/x1-x2用double型数据是有精度损耗到溢出。斜率存储:哈希表或者map表。 <string,int>...原创 2020-02-13 18:49:26 · 4381 阅读 · 0 评论 -
算法(39)-数组求和-暴力和大根堆解法
给两有序数组ARR1 ARR2,返回两个相加和最大的前K个。 比如:arr1={1,2,3,4,5} arr2={3,5,7,9,11} K=4 ,则返回res={16,15,14,14} 思路:1.所有两两相加后排序,原始,暴力的方法。 2.大根堆 size为k 用于存放 两数和。root:右下角值;"左","上"比大小决定下一路径。 ...原创 2020-02-13 08:49:10 · 204 阅读 · 0 评论 -
算法(38)-动态规划(1)-跳跃游戏-C++
题目:给定一个非负整数数组,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度(步数)。 判断你是否能够到达最后一个位置。输入:int arr[] = { 3,2,3,1,1,4 };输出:2题意:不明白的要去搜一下,网上很多说明。思路:当前最优解+下一步的最优解 迭代或者递归来完成。这是解决此类问题最简化的模型之...原创 2020-02-12 10:02:51 · 230 阅读 · 0 评论 -
算法(37)-暴力递归(4)-纸牌博弈-c++
题目:有一个整型数组A,代表数值不同的纸牌排成一条线。玩家a和玩家b依次拿走每张纸牌,规定玩家a先拿,玩家b后拿,但是每个玩家每次只能拿走最左或最右的纸牌,请返回最后获胜者的分数。思路:暴力递归,典型的“范围”上尝试的模型上代码#include <iostream>#include <vector> #include <stdlib.h>#i...原创 2020-02-10 18:48:24 · 306 阅读 · 1 评论 -
算法(36)-背包问题-01-C++
背包问题指这样一类问题,题意往往可以抽象成:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。本文讲的是最基本的01背包问题。 有N件物品和一个容量为V的背包。第i件物品的费用(即体积,下同)是w[i],价值是val[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。思路:从左到右...原创 2020-02-10 17:29:42 · 222 阅读 · 0 评论 -
算法(35)-暴力递归(3)-汉诺塔-C++
小朋友的益智玩具,就是把一些圈圈从a->移到c,小的在上面,大的在下面。问你怎么做。下面是图解:写成代码就是:先上个好理解版本的代码if(N==1) 为basecasevoid all(int N){ //开始位置:左->右 LeftToRight(N);}//1.左->右 三步 1.左到中 2.左到右 3.中到右void ...原创 2020-02-10 11:41:34 · 146 阅读 · 0 评论 -
算法(34)-暴力递归(2)-字符全排列-C++
比如我有一个"abc" 那么全排列就是 abc acb bac bca cab cba, 如果是“aac”,那么就是 aac aca caa,而不是 aac aca aac aca caa caa.递归:从左往右的模型。C++: vectorvoid process(vector<char> set, string path, vector...原创 2020-02-10 08:12:35 · 148 阅读 · 0 评论 -
算法(31)-贪心(1)-会议室安排-C++
会议室安排输入:一组会议的其实终止时间比如[7,8],[8,10],[9,12][10,15]..就一个会议室,如何安排会议室的利用率最高。输出:安排会议的个数,或者是安排了哪些会议。此时返回3 ,[7 8][8 10][10 15]思路:按结束时间排序 数据多时用小根堆上代码:/*贪心1 会议室安排 小根堆*/class Progr...原创 2020-02-08 12:06:45 · 629 阅读 · 0 评论 -
算法(33)-贪心(3)-花费和利润问题-C++
花费和利润问题。要求花费最少,利润最大。输入: 数组 costs,i号项目的花费 profits ,i号项目扣除花费后的利润 K 串行的最多的项目个数 m 初始的资金输出:你最后获得的最大钱数思路:花费 小根堆;利润 大根堆class Node_ipo ...原创 2020-02-08 15:10:20 · 363 阅读 · 0 评论 -
算法(25)-前缀树(2)-添加-查找-返回以某字符为首的查找个数-C++
前缀树三个主要的函数: 1.添加word void insert(string word) 2. 查询是否在字典树中 bool search(string word) ...原创 2020-02-08 09:56:29 · 180 阅读 · 0 评论 -
算法(26)-前缀树(3)-delete-JAVA-C++内存问题
对于前缀树,JAVA和C++编码不一样的在于节点删除。JAVA有JVM,对new的变量无需手动删除,而C++需手动删除动态分配的堆内存,也就是new delete 得成对出现。 C++ :必须遍历每个节点,手动释放空间,然后回到上级节点,再把位置标空=NULL。 JAVA :删除直接下级节点标空 ,即=NULL即可。 C++我并没有严格的测试 --destroy--...原创 2020-02-08 09:55:53 · 368 阅读 · 0 评论 -
算法(10)-冒泡-插入-选择-C++
冒泡、插入、选择三种排序已经说过。本文上的是亲测可行的C++代码,供大家参考。冒泡void bubbleSort(int arr[],int m_num){ cout << "bubbleSort******************" << endl; if (arr == NULL || m_num < 2) { return; } // 右到...原创 2020-02-05 09:57:40 · 135 阅读 · 0 评论 -
算法(40)-暴力递归(1)-字符串子序列-C++
暴力递归就是把所有的可能性都做一遍,比如全排列,最朴素的自然智慧。打印一个字符串的所有子集。比如“abc”,子集就是 a,b,c,ab,bc,abc.递归实现。实例注意事项:传递的是引用。 本例new ans后并没有删除。void process(string str, int index, string path, list<s...原创 2020-02-07 06:57:58 · 530 阅读 · 0 评论 -
算法(32)-贪心(2)-切金条问题-C++
问题: 一块金条切成两半,是需要花费和长度数值一样的铜板的。比如 长度为20的 金条,不管切成长度多大的两半,都要花费20个铜 板。一群人想整分整块金 条,怎么分最省铜板? 例如,给定数组{10,20,30},代表一共三个人,整块金条长度为 10+20+30=60. 金条要分成10,20,30三个部分。 如果, 先把长 度60的金条分成10和50,花费60 再把长度50的金条分成2...原创 2020-02-08 15:50:18 · 410 阅读 · 0 评论 -
算法(24)-前缀树(1)-treeNode结构-数组-C++
前缀树是处理字符串常见的数据结构。前缀树一般包含四个功能:1.添加word void insert(string word) 2. 删除word void delete(string word) 3. 查询是否在字典树中 b...原创 2020-02-08 09:56:17 · 1296 阅读 · 0 评论 -
算法(23)-单链表-在指定位置增加节点-C++
思路:在K位置增加节点,你要找的是k-1这个点。上代码。Node* addNode(Node* head, int Kth, int m_val){ Node* pre = head; Node* cur = head->next; Node* newnode = new Node(m_val); if(pre ==NULL) { pre = newnode;...原创 2020-02-06 10:16:48 · 582 阅读 · 0 评论 -
算法(22)-复制含随机指针的单链表-C++
单链表结构如下:两个节点 对象指针。class Noderand{public: int m_value; Noderand * next; Noderand * rand; Noderand(int value);};Noderand::Noderand(int value){ m_value = value;}思路:用hashMap key-valu...原创 2020-02-10 21:01:41 · 164 阅读 · 1 评论 -
算法(21)-词频统计-C++
给定一个string 字符串strArr,和一个char字符c,返回c在strArr中出现的个数。用一个map<char,int>记录字符和出现的次数。谈不上什么算法,基本就是coding.1.char c=strArr[i]: //类型转换string->char2.int len=strArr.length(); //数组长度...原创 2020-02-06 10:16:58 · 802 阅读 · 0 评论 -
算法(20)-merge不去重-链表-C++
merge单链表。例如:head1:0->2->3->7 list2:1->3->5->7->9结果:0->1->2->3->3->5->7->7->9class Node{public: int m_value; Node* next; Node(int va...原创 2020-02-06 10:15:38 · 118 阅读 · 0 评论 -
算法(17)-单链表-删除指定节点的值-C++
给定一个单链表head和一个值num,删除链表中值为num的值。比如1->2->3->4->5->null,num=3 删后即为:1->2->4->5.基本就一coding问题。思路:用容器将不等于num的节点收集起来再连起来。 提供两个版本:1.用vector ...原创 2020-02-06 10:14:44 · 461 阅读 · 0 评论 -
算法(19)-merge去重-两个整形有序数组 --C++
比链表的合并去重更容易实现。直接上代码,供各位参考。去重方法:1.用vector<int > vc保存新数组值时:对于有序数组, 新加的数!=数组的最后一个数 2.用set<int>intset;保存自然去重1.vector//合并两个有序数组//void mergeTwoarr(int arr1[], int arr2...原创 2020-02-07 06:59:18 · 339 阅读 · 0 评论 -
算法(18)-区间值-合并-C++-实例源码
在时间区间中插入一个新的时间区间(如果有重叠的话就合并区间)。 这些时间区间初始是根据它们的开始时间排序的。以数组为例:给定时间区间[1,3],[6,9],在这两个时间区间中插入时间区间[2,5],并将它与原有的时间区间合并,变成[1,5],[6,9].直接上代码//区间结构 两个值struct Interval { int start; in...原创 2020-02-06 10:16:08 · 360 阅读 · 0 评论 -
算法(16)链表-单链表-双链表-逆序-C++代码
单链表,双向链表实现逆序,C++代码,供大家参考。一般Node用struct定义,我这用的class.void reverseList_main()为主函数。class Node {public: int m_value; Node *next; //构造函数 Node(int value);};Node::Node(int value){ m_value = valu...原创 2020-02-05 09:57:16 · 149 阅读 · 0 评论 -
算法(15)-哈希表,有序表-C++
1.哈希表 哈希表可以理解为一个K,V数据库,是一种集合结构。 1.有key,无value :JAVA 用HashSet,C++用UnOrderedSet 2.有key,有value:JAVA用HashMap,C++用UnOrderedMap 一般操作:增(put)、删(remove)、改(put)、查(get) 基础类型:内部按值传递;不是基础类型,按引...原创 2020-02-07 07:00:28 · 1211 阅读 · 1 评论 -
算法(13)-堆-C++
堆,逻辑上是一个完全二叉树,实现是一个数组。时间复杂度O(N*logN)。二叉树的高度就决定了O(logn)这个结论。堆两个操作:1.heapInsert() 加一个新值到堆里 ,值与父比,如果大则交换位置。 2.heapify() 减一个最大的值前面有篇是JAVA版,本篇为C++版。实例亲测有效,供大家参考。//arr[0...inde...原创 2020-02-05 09:57:02 · 91 阅读 · 0 评论 -
算法(12)-运算符重载-C++
应用中对于系统函数,比如sort,默认是从小到大的排序,现在我想让它从大到小的排序,我该怎么做呢? 或者我有一组对象,学生,有学号、年龄、分数等属性,我一会想按学号排,一会想按年龄排,一会想按分数排,如何做呢?JAVA中叫比较器,C++中叫运算符重载就派上用处了。 简而言之,利用系统函数自定义排序。 原理上就是先定义两个对象,然后定义返回值。返回值分>,&...原创 2020-02-05 09:56:25 · 118 阅读 · 0 评论