![](https://img-blog.csdnimg.cn/20190918135101160.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
c++算法及应用实例
文章平均质量分 66
常用算法汇总,可用于笔试刷题、逻辑锻炼、常用实例等
明月醉窗台
路漫漫其修远兮,吾将上下而求索
展开
-
windows与Ubuntu实现文件夹共享
1.安装包结果如下:2.安装另一个包下载结果如下:注:如果在最后一句选择了 Y,那么将是如下结果,即什么也没有安装3.解决bug:结果如下:4.创建一个samba服务的共享目录,并配置该目录为最高权限然后显示:5.修改samba服务的配置文件把原来的文件复制一份备份,输入如下命令:然后打开 /etc/samba/smb.conf 该配置文件:在配置文件的最后面加入下面的内容:退出保存.........原创 2022-06-24 10:27:29 · 4147 阅读 · 0 评论 -
华为笔试题库之较难--难度
1.明明的随机数#include <stdlib.h>#include <stdio.h>#include <string.h> int main(){ int n; int a; //以数组下标来存储随机数,下标对应的数组值为1,来说明是否是存储的随机数 while(~scanf("%d", &n)) { int count[1001] = {0}; int i; for原创 2022-05-12 09:57:01 · 421 阅读 · 0 评论 -
华为笔试题库之中等--难度
1.购物单// 题目来源:华为机试——牛客HJ16——购物单#include <iostream>#include <vector>using namespace std;int main() { int N, m; cin >> N >> m; // 由于价格是10的整数倍,处理一下以降低空间/时间复杂度 N /= 10; vector<vector<int> > prices(原创 2022-05-11 17:27:28 · 601 阅读 · 0 评论 -
华为笔试题库之简单三--难度
1.计算日期到天数转换#include <iostream>using namespace std;int main(){ int year,mon,day; int data[]={31,28,31,30,31,30,31,31,30,31,30,31}; while(cin>>year>>mon>>day) { int sum; for(int i=0;i<mon-1;i++)原创 2022-05-08 11:43:16 · 327 阅读 · 0 评论 -
华为笔试题库之简单二--难度
简单难度之二1.字符串排序#include<iostream>#include<vector>#include<algorithm>using namespace std;int main(){ int n=0; cin>>n; string str; vector<string> vec; while(cin>>str) vec.push_back(str); sort(vec原创 2022-05-08 10:14:24 · 303 阅读 · 0 评论 -
华为笔试题库之简单一--难度
1.字符串最后一个单词的长度#include<bits/stdc++.h>using namespace std;int main() { string s; while(cin >> s); cout << s.size(); return 0;}2.计算某字符出现次数#include<iostream>#include<string>using namespace std;int m原创 2022-05-05 21:50:09 · 369 阅读 · 0 评论 -
华为笔试题库之入门 ---难度
1.取近似值,四舍五入:#include<iostream>using namespace std;int main(){ float a; cin>>a; int b=a; float c=a-b; if(c>=0.5){ b+=1; } cout<<b; return 0;}2.提取不重复整数#include<bits/stdc++.h>using n原创 2022-05-05 19:39:52 · 1064 阅读 · 1 评论 -
积分图加速
积分图加速常用于计算面积、加速卷积运算、避免重复计算等1.一种简单的快速计算方法void integral(unsigned char*inputMatrix,unsigned char*outpMatirx,int width,int height){ unsigned long *columnSum=new unsigned long[width]; for(int i=0;i<width;++i) { columnSum[i]=inputMat原创 2021-12-26 18:22:42 · 569 阅读 · 0 评论 -
C++数据处理之求众数+排序
总结了一下在进行数据处理时会遇到的问题及有效处理方法,众数、平均值及统计排序最为常用,算法效果对最终结果也具有重要意义原创 2021-12-11 16:09:55 · 3028 阅读 · 2 评论 -
拟合算法之一 直线拟合
直线拟合很早就想学习拟合了,经常听同事用到拟合,当时尚且一窍不通,必须快递加急紧追此处才是,也参考了网上大佬的一些宝贵经验,先将拟合方法总结如下:最小二乘法1.原理2.举例实现void fitline3(){ float b = 0.0f, k=0.0f; vector<Point>points; points.push_back(Point(27, 39)); points.push_back(Point(8, 5)); points.push_back(Point(8,原创 2021-10-12 19:52:31 · 3303 阅读 · 0 评论 -
C++算法之更加复杂的数据结构
更加复杂的数据结构1.并查集并查集(union-find,or disjoint set)可以动态的连通两个点,并且可以非常快速的判断两个点是否连通。假设存在n个节点,我们将所有节点的父亲标为自己;每次要连接节点i和j时,我们可以将i的父亲标为j;每次要查询两个节点是否相连时,我们可以查找i和j的祖先是否最终为一个人。题目一:Redundant Connection(Medium)在无向图找出一条边,移除它之后该图能够成为一棵树(即无向无环图)。如果有多个解,返回在原数组中位置最靠后的那条边。原创 2021-09-29 09:59:30 · 236 阅读 · 0 评论 -
C++算法之指针三剑客---图
图1.数据结构介绍作为指针三剑客之三,图是树的升级版。图通常分为有向(directed)或无向(undirected),有循环(cyclic)或无循环(acyclic),所有节点相连(connected)或不相连(disconnected)。树即是一个相连的无向无环图,而另一种很常见的图是有向无环图(Directed Acyclic Graph,DAG)。图通常有两种表示方法。假设图中一共有 n 个节点、m 条边。第一种表示方法是邻接矩阵 (adjacency matrix):我们可以建立一个 n原创 2021-09-24 09:59:07 · 178 阅读 · 0 评论 -
C++算法之指针三剑客二
树1.数据结构介绍作为(单)链表的升级版,我们通常接触的树都是二叉树(binary tree),即每个节点最多有两个子节点;且除非题目说明,默认树中不存在循环结构。LeetCode 默认的树表示方法如下。struct TreeNode{ int val; TreeNode *left; TreeNode *right; TreeNode(int x):val(x),left(NULL),right(NULL){}};可以看出,其与链表的主要差别就是多了一个子节点原创 2021-09-23 19:55:23 · 139 阅读 · 0 评论 -
C++算法之指针三剑客一
指针一:链表1.数据结构介绍(单)链表是由节点和指针构成的数据结构,每个节点存有一个值,和指向下一个节点的指针,因此很多链表问题可以用递归来处理。不同于数组,链表并不能直接获取任意节点的值,必须要通过指针找到该节点后才能获取其值。同理,在未遍历到链表结尾时,我们也无法知道链表的长度。除非以来其他数据结构储存长度。LeetCode默认的链表表示方法如下:struct ListNode{ int val; ListNode *next; ListNode(int x):val(x)原创 2021-09-22 19:57:22 · 138 阅读 · 0 评论 -
C++算法之字符串
字符串1.字符串比较题目一:判断两个字符串包含的字符是否完全相同我们可以利用哈希表或者数组统计两个数组中每个数字出现的频次,若频次相同,则说明它们包含的字符完全相同。bool isAnagram(string s,string t){ if(s.length() != t.length()) { return false; } vector<int>counts(26,0); for(int i=0;i<s.length(原创 2021-09-18 10:08:28 · 708 阅读 · 0 评论 -
C++算法之数据结构三
数据结构1.哈希表哈希表,又称散列表,使用 O(n) 空间复杂度存储数据,通过哈希函数映射位置,从而实现近似 O(1) 时间复杂度的插入、查找、删除等操作。C++ 中的哈希集合为 unordered_set,可以查找元素是否在集合中。如果需要同时存储键和值,则需要用 unordered_map,可以用来统计频率,记录内容等等。如果元素有穷,并且范围不大,那么可以用一个固定大小的数组来存储或统计元素。例如我们需要统计一个字符串中所有字母的出现次数,则可以用一个长度为 26 的数组来进行统计,其哈希函数即原创 2021-09-17 17:56:44 · 163 阅读 · 0 评论 -
C++算法之数据结构二
妙用数据结构1.栈和队列题目一:尝试使用栈(stack)来实现队列(queue)我们可以用两个栈来实现一个队列:因为我们需要得到先入先出的结果,所以必定要通过一个额外栈翻转一次数组。这个翻转过程既可以在插入时完成,也可以在取值时完成。class MyQueue{ stack<int>in,out;public: MyQueue(){}; void push(int x) { in.push(x); } int pop(原创 2021-09-16 19:30:06 · 284 阅读 · 0 评论 -
C++算法之数据结构一
妙用数据结构主要介绍如下:1.C++ STLSequence Containers:维持顺序的容器。(a). vector:动态数组,是我们最常使用的数据结构之一,用于 O(1) 的随机读取。因为大部分算法的时间复杂度都会大于 O(n),因此我们经常新建 vector 来存储各种数据或中间变量。因为在尾部增删的复杂度是 O(1),我们也可以把它当作 stack 来用。(b). list:双向链表,也可以当作 stack 和 queue 来使用。很少用到这个数据结构。一个例外是经典的 LRU原创 2021-09-15 19:50:41 · 170 阅读 · 0 评论 -
C++算法之神奇的位运算
位运算位运算是算法题里比较特殊的一种类型,它们利用二进制位运算的特性进行一些奇妙的优化和计算。常用的位运算符号包括:“∧”按位异或、“&”按位与、“|”按位或、“∼”取反、“<<”算术左移和“>>”算术右移。以下是一些常见的位运算特性,其中 0s 和 1s 分别表示只由 0 或 1构成的二进制数字。1.基础问题给定两个十进制数字,求它们二进制表示的汉明距离(Hamming distance,即不同位的个数)。题解:对两个数进行按位异或操作,统计有多少个1即可原创 2021-09-13 19:56:28 · 298 阅读 · 0 评论 -
C++算法之巧解数学问题
巧解数学问题利用C++求解经典数学问题1.公倍数与公因数利用辗转相除法,我们可以很方便地求得两个数的最大公因数(greatest common divisor,gcd);将两个数相乘再除以最大公因数即可得到最小公倍数(least common multiple, lcm)。首先介绍一下辗转相除法:#include<iostream>#include<cstdio>using namesapce std;int fun(int m,int n){ int r原创 2021-09-13 11:33:10 · 1493 阅读 · 0 评论 -
C++算法之化繁为简的分治法
化繁为简的分治法1.算法解释顾名思义,分治问题由“分”(divide)和“治”(conquer)两部分组成,通过把原问题分为子问题,再将子问题进行处理合并,从而实现对原问题的求解。我们在排序章节展示的归并排序就是典型的分治问题,其中“分”即为把大数组平均分成两个小数组,通过递归实现,最终我们会得到多个长度为 1 的子数组;“治”即为把已经排好序的两个小数组合成为一个排好序的大数组,从长度为 1 的子数组开始,最终合成一个大数组。我们也使用数学表达式来表示这个过程。定义 T(n) 表示处理一个长度为 n原创 2021-09-09 20:15:30 · 430 阅读 · 0 评论 -
C++算法之动态规划实例
动态规划解决相关问题1.分割类型题题目一:给定一个正整数,求其最少可以由几个完全平方数相加构成。对于分割类型题,动态规划的状态转移方程通常并不依赖相邻的位置,而是依赖于满足分割条件的位置。我们定义一个一维矩阵 dp,其中 dp[i] 表示数字 i 最少可以由几个完全平方数相加构成。在本题中,位置 i 只依赖 i -k^2 的位置,如 i - 1、i - 4、i - 9 等等,才能满足完全平方分割的条件。因此 dp[i] 可以取的最小值即为 1 + min(dp[i-1], dp[i-4], d原创 2021-09-07 11:38:04 · 802 阅读 · 3 评论 -
C++算法之动态规划一
深入浅出动态规划解释:动态规划(Dynamic Programming,DP)在查找很多重叠子问题的最优解时有效,他将问题重新组合成子问题,为了避免多次解决这些子问题,他们的结果都逐渐被计算并保存,从简答的问题直到整个问题都被解决。动态规划和其他遍历算法(广度搜索)都是将原问题拆成多个子问题然后求解,本质区别是:动态规划保存子问题的解,避免重复计算。解决动态规划的关键是找到转移方程,这样我们可以通过计算和存储子问题的解来求解最终问题。1.基本动态规划:一维题目一:给定 n 节台阶,每次可以走一步或走原创 2021-08-31 09:58:40 · 1260 阅读 · 0 评论 -
C++搜索算法之广度优先搜索
1.含义广度优先搜索不同于深度优先搜多,它是一层层进行遍历的,因此需要先入先出的队列而非先入后出的栈进行遍历。由于是按层次进行遍历,广度优先搜索时按照“广”的方向进行遍历的,也常常用来处理最短路径问题。2.题目一输入是一个二维整数数组,输出是一个非负整数,表示需要填海造陆的位置数。本题实际上是求两个岛屿间的最短距离,因此我们可以先通过任意搜索方法找到其中一个岛屿,然后利用广度优先搜索,查找其与另一个岛屿的最短距离。vector<int>direction{-1,0,1,0,-1}原创 2021-08-24 20:06:47 · 1474 阅读 · 0 评论 -
C++搜索算法之回溯法 backtracking
回溯法回溯法是优先搜索的一种特殊情况,又称为试探法,常用于记录节点状态的深度优先搜索。其核心是回溯,在搜索到某一节点的时候,如果发现目前节点及子节点并不是需求目标时,回退到原来的节点继续搜索,并且把目前节点修改的状态还原。一般有两种情况,一种是修改最后一位输出,比如排列组合;一种是修改访问标记,比如矩阵里搜字符串。**题目一给定一个无重复数字的整数数组,求其所有的排列方式//对于每一个当前位置i,我们可以将其与之后的任意位置交换,然后继续处理位置i+1,直到处理最后一位//主函数vec原创 2021-08-20 17:23:45 · 1004 阅读 · 0 评论 -
C++算法之搜索算法一 深度优先搜索
**搜索算法**深度优先搜索和广度优先搜索是两种最常见的优先搜索方法,它们被广泛地运用在图和树等结构中进行搜索。题目1给定一个二维的0-1矩阵,其中0表示 海洋,1表示陆地,单独的或相邻的陆地可以形成岛屿,每个格子只与其上下左右四个格子相邻,求最大的岛屿面积。一般来说,深度优先搜索类型的题目可以分为主函数和辅函数,主函数用于遍历所有的搜索位置,判断是否可以开始搜索,如果可以即在辅函数进行搜索。辅函数则负责深度优先搜索的递归调用。vector<int>direction{[-1,0原创 2021-08-18 20:12:09 · 700 阅读 · 0 评论 -
图像训练时文件夹批量测试
智能型操作方法:1.批量生成文件目录如果你有n个文件夹目录,每个目录下有一定数据集在此目录下新建list.txt文件,打开输入//在txt文件中输入dir *.* /b >list.txt然后另存为list.bat文件,双击.bat文件,打开txt会生成相应文件夹目录2.文件读取路径读取int readlist(string in_list,vector<string>&result){ ifstream in_file(in_list);原创 2021-08-18 16:51:33 · 184 阅读 · 0 评论 -
C++算法之排序算法
排序算法千变万化1. 排序1.快速排序//采用左闭右闭的二分写法void quick_sort(vector<int>&nums,int l,int r){ if(l+1>r){ return; } int first=l,last=r-1,key=nums[first]; while(first<last){ while(first<last&&nums[last]>=key){原创 2021-08-17 20:03:26 · 106 阅读 · 0 评论 -
C++算法之二分查找
二分查找算法解释:二分查找也被称二分法或者折半查找,每次查找时通过将待查找区间分成两部分并只取一部分查找,将查找的复杂度大大减少,对于一个长度为O(n)的数组,二分查找的时间复杂度为O(logn)1.求开方给定一个非负整数,求他的开放你,向下取整int mySqrt(int a){ if(a==0) return a; int l=1,r=a,mid,sqrt; while(l<=r){ mid=l+(r-1)/2; sqrt=a/mi原创 2021-08-16 21:58:29 · 608 阅读 · 0 评论 -
C++算法之玩转双指针
玩转双指针1.算法解释双指针主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务若两个指针指向同一数组,遍历方向相同且不会相交,也成为滑动窗口若指向同一数组,但是遍历方向相反,则可用来进行搜索指针与常量int x;int *p1=&x;//指针可以被修改,值也可被修改const int*p2=&x;//值不可修改int * const p3 =&x;//指针不可被修改const int * const p4 =&x;//皆不可修改*指针函数与原创 2021-08-13 17:34:32 · 671 阅读 · 0 评论