算法杂例
本专栏介绍一些算法的实现过程,以及它的介绍
dos diosas
这个作者很懒,什么都没留下…
展开
-
035.贪心算法--区间调度问题
给你一些区间算出这些区间中有几个不相交的区间?函数原型如下:所以上述问题可以转化为如下的代码片段public int intervalSchedule(int [][] intvs){ if(intvs.length==0)return 0; //按end升序排序 Arrays.sort(intvs,new Comparator<int[]>(){ public int compare(int []a,int []b){ return a[1]-b[1]; }原创 2020-06-27 12:46:09 · 128 阅读 · 0 评论 -
034.0-1背包问题
#include<iostream>#include<vector>#include<cassert>#include<algorithm>using namespace std;int knapsack(int W, int N, vector<int>& wt, vector<int>& val) { // base case 已初始化 vector<vector<int&.原创 2020-06-23 18:57:42 · 150 阅读 · 1 评论 -
033.找出假币
解决方案如下#include<iostream>#include<cstring>using namespace std;char Left[3][7]; //天平左边硬币char Right[3][7]; //天平右边硬币char result[3][7]; //结果bool IsFake(char c, bool light);//light 为真表示假设假币为轻 ,否则表示假设假币为重int main(){ int t; cin >...原创 2020-06-09 15:46:35 · 211 阅读 · 0 评论 -
032.Biorhythm问题
#include<iostream>#include<cstdio>using namespace std;#define N 21252int main(){ int p, e, i, d, caseNo = 0; while (cin >> p >> e >> i >> d && p != -1) { ++caseNo; int k; for (k = d + 1; (k ...原创 2020-06-09 14:36:22 · 156 阅读 · 0 评论 -
031.完美立方问题
#include<iostream>#include<cstdio>using namespace std;int main(){ int N; scanf_s("%d",&N); for (int a = 2; a <= N; a++) { for (int b = 2; b < a; b++) { for (int c = 2; c < b; c++) { for (int d = 2; d < ..原创 2020-06-09 14:14:06 · 266 阅读 · 0 评论 -
030.顺序搜索
#include<iostream> using namespace std;int Search(int* L, int x){ int len = sizeof(L) / sizeof(int); int j = 0; while (j<len && x>L[j]) { j = j + 1; } if (x < L[j] ...原创 2020-05-08 13:55:37 · 93 阅读 · 0 评论 -
029.欧几里得算法
#include<iostream>using namespace std;int Euclid(int m, int n){ int r; while (m > 0) { r = n % m; n = m; m = r; } return n;}int main(){ int x; int y; cin >> x; c...原创 2020-05-08 13:38:41 · 76 阅读 · 0 评论 -
028.Hailstone序列
hailstone序列的定义如下下面给出非递归实现#include<iostream>#include<vector>using namespace std;vector<int>obj;vector<int> hailstone(int n){ vector<int>res; while (n != 1) {...原创 2020-05-03 18:50:43 · 668 阅读 · 0 评论 -
027.打印蛇形方阵
#include<stdio.h>#define N 20int main(){ int i, j, a[N][N], n, k; printf("请输入矩阵的阶:\n"); scanf_s("%d",&n); k = 1; /*输出上三角*/ for (i = 1; i <= n; i++) { for (j = 1; j <= i; j+...原创 2020-04-30 20:59:38 · 200 阅读 · 0 评论 -
026.穷举法验证哥德巴赫猜想:任一大于6的数字都可以被拆分为两个素数之和
#include<iostream> using namespace std;int isPrime(int n) { //判断是否是素数 int i; if (n == 1) return 1; else { for (i = 2; i < n; i++) if (n % i == 0) return 0; return 1; }}i...原创 2020-04-30 18:34:26 · 458 阅读 · 0 评论 -
025.打印螺旋矩阵
#include<iostream>#define N 10using namespace std;int main(){ int Matrix[N][N]; int k = 1; cout << "Spiral Matrix:" << endl; for (int i = 0; i <= N / 2; i++)//控制圈数 {...原创 2020-04-30 18:00:12 · 93 阅读 · 0 评论 -
024.Karatsuba算法
#include<iostream>#include<cmath>#include<algorithm>using namespace std;//计算某一运算数的位数int size(long long x){ int sum = 0; do { sum++; x /= 10; } while (x); return su...原创 2020-04-29 14:55:19 · 685 阅读 · 0 评论 -
023.利用递归求解斐波那契数列第n项
#include<iostream>using namespace std;long fib(long n){ if (n == 0 || n == 1) { return n; } else { return fib(n - 1) + fib(n - 2); }}int main(){ while (true) { int n; cout...原创 2020-04-28 22:21:20 · 341 阅读 · 0 评论 -
022.欧几里得算法
#include<iostream>using namespace std;int gcd(int m, int n){ int r; h: r = m - floor(m / n) * n; if (r == 0) { return n; } else { m = n; n = r; goto h; }}int main(){ ...原创 2020-04-28 21:19:44 · 78 阅读 · 0 评论 -
021.计算阶乘(递归算法)
#include<iostream>using namespace std;int factorial(int n){ if (n == 0) { return 1; } else { return n * factorial(n - 1); }}int main(){ int result = factorial(10); cout <...原创 2020-04-28 21:17:36 · 99 阅读 · 0 评论 -
020.自定义排序规则对结构体数组进行排序(以学生信息为例)
#include<iostream>#include<cstring>#include<algorithm>using namespace std;typedef struct Student{ char id[15];//15位学号 int score;//某科课程分数}stu;//定义排序规则bool cmp(Student a, ...原创 2020-04-28 19:19:12 · 307 阅读 · 0 评论 -
019.使用递归求解汉诺塔问题
#include<iostream>using namespace std;void move(char a, char b){ cout << a<<"----------------->" << b << endl;}void hanoi(int n, char a, char b,char c)//将n个盘子由...原创 2020-04-28 19:16:19 · 129 阅读 · 0 评论 -
018.矩阵的运算
下面这段程序给出了矩阵的加法,减法,以及乘法的运算,并且使用了运算符重载等方式输出求解的答案,欲了解详细的过程请认真阅读代码。#include<iostream>using namespace std;template<typename T>class Matrix{private: ...原创 2020-04-28 19:09:31 · 133 阅读 · 0 评论 -
017.BM算法
在计算机科学里,Boyer-Moore字符串搜索算法是一种非常高效的字符串搜索算法。它由Bob Boyer和J Strother Moore设计于1977年。此算法仅对搜索目标字符串(关键字)进行预处理,而非被搜索的字符串。虽然Boyer-Moore算法的执行时间同样线性依赖于被搜索字符串的大小,但是通常仅为其它...原创 2020-04-21 17:17:20 · 145 阅读 · 0 评论 -
016.KMP算法:version02(改进版)
#include<iostream>#include<string>using namespace std;int* buildNext(string P){ //构造模式串P的next表 size_t m = P.length(), j = 0;//主串指针 int* N = new int[m];//next表 int t = N[0] = -1;/...原创 2020-04-21 16:30:46 · 118 阅读 · 0 评论 -
015.KMP算法:version01(待改进)
在计算机科学中,Knuth-Morris-Pratt字符串查找算法(简称为KMP算法)可在一个主文本字符串S内查找一个词W的出现位置。此算法通过运用对这个词在不匹配时本身就包含足够的信息来确定下一个匹配将在哪里开始的发现,从而避免重新检查先前匹配的字符。 这个算法是由高德纳和沃恩·普拉特在...原创 2020-04-21 16:25:31 · 114 阅读 · 0 评论 -
014.字符串匹配算法:(暴力匹配-版本二)
#include<iostream>#include<string>using namespace std;//如果匹配成功那么返回值是模式串在文本串中的起始位置,反之//如果匹配失败,那么返回值是文本串与模式串的长度之差+1。int match(string P, string T){ //串匹配算法(Brute-Force-version-1) si...原创 2020-04-21 16:07:55 · 113 阅读 · 0 评论 -
013.字符串匹配算法:(暴力匹配-版本一)
#include<iostream>#include<string>using namespace std;//如果匹配成功那么返回值是模式串在文本串中的起始位置,反之//如果匹配失败,那么返回值是文本串的长度。int match(string P, string T){ //串匹配算法(Brute-Force-version-1) size_t n =...原创 2020-04-21 16:00:20 · 156 阅读 · 0 评论 -
012.中缀表达式求值以及由中缀表达式生成RPN算法
如下代码主要参考清华大学邓俊辉所编写的《数据结构C++版》实现,实际上这段代码仅仅是对源代码包进行进一步整理以及改写,需要注意的是,其中的main函数涉及到了一个从 const char * 类型到 char *类型之间的转换,不得不提及的是,这种语法一般来讲是不提倡的,而且这种语法直到C++11版本问世之后才新加入的特性...原创 2020-04-13 20:42:21 · 246 阅读 · 0 评论 -
011.利用Eratosthenes筛法求解素数问题
#include"bitmap.h"void Eratosthenes(int n){ Bitmap B(n); B.set(0); B.set(1);//0&1都不是素数 for (int i = 2; i < n; i++) { //反复地从下一个可以认定的素数i开始 if (!B.test(i)) { //注意for循环初始值以及素数判定条件...原创 2020-04-13 13:57:11 · 715 阅读 · 2 评论 -
010.数组倒置算法:迭代版
#include<iostream>using namespace std;void reverse(int* A, int lo, int hi){ while (lo < hi) { swap(A[lo++], A[hi--]); }} void reverse(int* A, int n){ reve...原创 2020-04-13 10:16:26 · 134 阅读 · 0 评论 -
009.数组求和算法(二分递归)
#include<iostream>using namespace std;int sum(int A[], int lo, int hi){ if (hi - lo < 2) { return A[lo]; } int mi = (lo + hi) >> 1; return sum(A, lo,...原创 2020-04-13 01:35:51 · 397 阅读 · 0 评论 -
008.数组求和算法(线性递归)
#include<iostream>using namespace std;int sum(int A[], int n) { if (1 > n) return 0; else return sum(A, n - 1) + A[n - 1];} int main(){ int a[] = { 1,2...原创 2020-04-13 01:32:41 · 256 阅读 · 0 评论 -
007.数组求和算法(迭代方法)
#include<iostream>using namespace std;int sumI(int A[], int n) { int sum = 0; for (int i = 0; i < n; i++) sum += A[i]; return sum; }int main(){ int a[] = ...原创 2020-04-13 01:30:11 · 727 阅读 · 0 评论 -
006.栈混洗
这里给出栈混洗操作的实现代码,本算法的实现是基于邓俊辉教授所讲的课程《数据结构》中的讲义完成的,当然这里不乏也参考了一些其他的博客以及教材,值得一提的是最初由Knuth所证明正确性的本算法有着线性的时间复杂度,由于本人愚钝,在实现的时候出现了许多问题,在这里感谢给出所有其他类似实现方式的原作者们,有了你们的帮助,这段代码才能得以完成。#include<iostream>#inclu...原创 2020-04-12 21:20:02 · 558 阅读 · 1 评论 -
005.利用栈实现括号匹配算法(迭代版)
#include"Stack.h"using namespace std;bool parent(const char exp[], int lo, int hi){ //表达式括号匹配检查,可兼顾三种括号 Stack<char>S;//使用栈记录已发现但现尚未匹配的左括号 //cout << S.empty() << endl; for (...原创 2020-04-12 13:34:56 · 148 阅读 · 0 评论 -
004.利用循环迭代实现十进制数转化为N进制数
#include"Stack.h"using namespace std;void convert(Stack<char>& S, __int64 n, int base){ //十进制正整数n到base进制的转换(递归版) static char digit[] //0<n,1<base<=16,,新进之下的数位符号,可视base取值范围适...原创 2020-04-12 12:43:36 · 155 阅读 · 0 评论 -
003.利用Stack递归实现十进制数转化为N进制数
#include"Stack.h"using namespace std;void convert(Stack<char>& S, __int64 n, int base){ //十进制正整数n到base进制的转换(递归版) static char digit[] //0<n,1<base<=16,,新进之下的数位符号,可视base取值范围适...原创 2020-04-12 12:37:28 · 161 阅读 · 0 评论 -
002.LCS:最长公共子序列
最长公共子序列(递归版) #include <iostream> using namespace std; #define MAXSTRLEN 200 //递归算法求解最长公共子序列的长度 int Lcs(char *str1, char *str2) { if(*str1=='\0' || *str2=='\0') { return 0; } i...原创 2020-04-10 22:22:58 · 112 阅读 · 0 评论 -
001.Max2:使用递归求解数组中最大的两个元素
#include <iostream>#include <algorithm>using namespace std;//****递归求解数组里面最大的两个数字******//void max2(int a[], int lo, int hi, int &x1, int &x2){ if (lo + 2 == hi) { ...原创 2020-04-10 22:25:38 · 229 阅读 · 0 评论