算法
零丁若叹
这个作者很懒,什么都没留下…
展开
-
数组中出现次数超过一半的数字
实现一个函数,找出数组中出现次数超过一半的元素思路:默认第一个元素为找到的元素result,设置times变量为1,遍历数组,如果后面的元素等于result,times加1,如果后面的元素不等于result,times减1,如果times为0,则把result替换为当前元素C++.h#ifndef MoreThanHalf_hpp#define MoreThanHalf_hpp#include <stdio.h>#endif /* MoreThanHalf_hpp */in原创 2022-03-11 23:50:34 · 796 阅读 · 0 评论 -
字符串的排列组合
一个字符串,打印出所有的排列组合,如"abc",所有的排列组合为abc,acb,bac,bca,cba,cab思路: 先确定第一位字符,问题转化为求解后面n-1个字符的排列组合问题,可以使用递归的方式解决。第一位字符可以是字符串中的任何一个字符,所以需要把每一个字符交换到首位,先使用循环,循环里面调用递归函数。C++.h#ifndef Arrangement_h#define Arrangement_h#include <stdio.h>#endif /* Arrangemen原创 2022-03-06 22:55:59 · 495 阅读 · 0 评论 -
层序遍历二叉树
实现一个函数,完成层序遍历二叉树。思路:使用一个队列,保存根结点,先打印根结点的值,把根结点从队列中清除。把根结点的左结点放入到队列中,把根结点的右结点放入队列中,循环进行此过程。C++.h#ifndef TreeAbout_hpp#define TreeAbout_hpp#include <stdio.h>#endif /* TreeAbout_hpp */struct TreeNode{ int val; TreeNode *left; Tre原创 2022-03-05 19:41:54 · 566 阅读 · 0 评论 -
链表的反转
实现一个函数,完成链表的反转思路:1.循环的方式建立两个指针,前面的指针的next指向后面的指针,然后分别移动两个指针,循环到链表结尾2.递归的方式处理head结点的反转使用head->next->next = head,head->next = NULL,然后递归反转剩余的链表部分.hpp文件#ifndef LinkedList_hpp#define LinkedList_hpp#include <stdio.h>#endif /* LinkedList原创 2022-03-05 11:27:24 · 469 阅读 · 0 评论 -
链表倒数第k个结点
实现一个函数,查找链表的倒数第k个结点思路:使用两个指针,第一个指针先指向第k个结点,然后两个指针同时移动,第一个指针移动到末尾的时候,第二个指针刚好位于倒数第k个位置C++.hpp文件//// LinkedList.hpp// CPlusPlusProject////////微信公众号:程序员开发环境#ifndef LinkedList_hpp#define LinkedList_hpp#include <stdio.h>#endif /* Linked原创 2022-03-02 22:37:20 · 241 阅读 · 0 评论 -
数据结构与算法代码选集
1.整形二维数组中,每一行从左到右递增,每一列从上到下递增,判断数组中是否含有该整数。https://blog.csdn.net/u011608357/article/details/122899737?spm=1001.2014.3001.55022.一个字符串空间足够,把字符串中的每个空格替换成"%20",如"He ll o"替换为"He%20ll%20o"https://blog.csdn.net/u011608357/article/details/122911005?spm=1001.201原创 2022-02-27 23:54:35 · 263 阅读 · 0 评论 -
移动数组正负数
一个整型数组,包含负数和正数,实现一个函数,把所有的负数挪到数组的左边,所有的正数挪到数组的右边。思路:使用两个指针,分别从数组的两头遍历数组,从左边找到一个负数,从右边找到一个正数,交换这两个数字,循环此过程,知道两个指针相遇。C++.h文件#ifndef PositiveNegative_h#define PositiveNegative_h#include <stdio.h>#endif /* PositiveNegative_h *//* arr为数组,low为数原创 2022-02-27 13:37:38 · 530 阅读 · 0 评论 -
斐波那契数
实现一个函数,输入n,输出第n个斐波那契数思路:可以使用递归和循环的方式分别实现。如果使用的递归,斐波那契数f(n)=f(n-1) + f(n-2)。如果使用循环实现,只要新建变量保存前面两个结果f(n-1)和f(n-2)就可以了。C++.h文件#ifndef FibNumber_h#define FibNumber_h#include <stdio.h>#endif /* FibNumber_h *///n为第几个斐波那契数int fibNumberRecursive(原创 2022-02-26 23:31:40 · 373 阅读 · 0 评论 -
二分查找实现
一个整型有序数组,完成二分查找思路:待查找数字和中间的数字比较,如果比中间的数字小,则在前半段继续查找,如果比中间的数字大,则在后半段继续查找C++.h文件#ifndef BinarySearch_h#define BinarySearch_h#include <stdio.h>#endif /* BinarySearch_hpp *//* arr为待查找数据 low为数组最小的序号 high为数组最大的序号 target为待查找数字 返回值0代表找到,返回值-1原创 2022-02-26 22:13:17 · 296 阅读 · 0 评论 -
快速排序实现
一个整型数组,完成快速排序思路:选取一个元素作为哨兵元素,遍历数组,比哨兵元素小的元素放在左侧,比哨兵元素大的放在右侧,再把哨兵元素放在中间位置,递归此过程。C++代码QuickSort.h文件#ifndef QuickSort_h#define QuickSort_h#include <stdio.h>#include <iostream>#endif /* QuickSort_hpp *//* arr为待排序数组 low为数组最小的序号, high为原创 2022-02-25 23:59:39 · 118 阅读 · 0 评论 -
两个栈实现一个队列
使用两个栈实现一个队列,实现添加方法appendData,实现删除对头元素方法deleteData,实现查看对头元素headData方法思路:栈是现金后出的数据结构,队列是先进先出的数据结构。可以使用第一个栈存入数据实现appendData。需要删除或者查看队头元素时,如果第二个栈为空,把第一个栈的数据存放到第二个栈里面,返回第二个栈的栈顶元素就可以了。如果第二个栈不为空,直接返回第二个栈的栈顶元素。stack.hpp头文件#ifndef StackQueue_hpp#define StackQu原创 2022-02-20 17:26:10 · 410 阅读 · 0 评论 -
链表基本操作
链表是一种基本的数据结构,它由链表结点串联而成,在内存中的存放地址是不连续的。链表结点包含了一个值和指向下一个结点的指针,本篇文章介绍链表的基本操作,包括链表的建立,遍历,查询和删除。#include <iostream>/* arr为数组,length为数组长度 */LinkNode *createLink(int arr[], int length){ if (arr == NULL) { return NULL; } int原创 2022-02-19 23:42:01 · 299 阅读 · 0 评论 -
字符串替换空格
题目:一个字符串空间足够,把字符串中的每个空格替换成"%20",如"He ll o"替换为"He%20ll%20o"思路:先遍历字符串,获得空格的个数,从而获取新字符串的长度。从字符串的尾部遍历字符串,逐个复制字符,遇到空格替换为%20.#include <iostream>void trimBlank(char arr[], int length){ if (arr == NULL || length <= 0) { return; }原创 2022-02-13 16:58:38 · 610 阅读 · 0 评论 -
二维数组查找元素
整形二维数组中,每一行从左到右递增,每一列从上到下递增。判断数组中是否含有该整数。**思路: 从右上角开始查找,带查找的数字如果小于右上角的数,说明要查找的数字不在当前列,列数查找范围缩小,如果大于右上角的数,行数查找范围缩小。C++**#include <iostream>bool findNumber(int arr[][3], int rows, int columns, int num){ if (arr == NULL || rows <= 0 || col原创 2022-02-12 17:46:05 · 781 阅读 · 0 评论 -
希尔排序
希尔排序也被称为缩小增量排序,他的名字源于发明者Donald Shell,希尔排序是插入排序的一种,是对插入排序的改进。希尔排序的思想是选取增量h1,h2,h3…hk,首先使用h1作为间隔,把数组分成h1组,对每一组的数据进行插入排序,然后使用h2,h3…进行分组,插入排序,知道增量变为1。本文程序选取的增量序列为数组长度的一半,以后每次减半,直到增量为1.希尔排序是不稳定的排序方法。假设原创 2014-03-16 09:33:59 · 2376 阅读 · 0 评论 -
字符串的排列组合
1.字符串的组合字符串的组合,有字符串abc,它的所有组合为a,b,c,ab,ac,abc求字符串的组合可以使用递归的方法,程序如下:void print(string &s,int start,vector &t){ if(start==s.size()) { return ; } int i=0; for(i=start;i<s.size();++i) { t.p原创 2014-09-07 23:56:55 · 964 阅读 · 0 评论 -
求数组的最大值和最小值
求数组的最大最小值,可以遍历一遍数组,然后分别记录最大值和最小值,这种方法需要的比较次数为2N次。如果想要减少比较次数,可以采用的方法是遍历数组,然后比较相邻元素,把相邻元素的较大值放在后面,较小的放在前面。在从较大值中选取最大值即为整个数组的最大值,从较小值中选取最小值即为整个数组的最小值。void findmaxmin(int a[],int n){ if(a==NULL||n<0)原创 2014-09-09 01:00:12 · 5455 阅读 · 4 评论 -
字符串匹配算法
1.普通的字符串匹配算法可以从开始处逐个匹配字符,遇到不相等的情况,可以回溯,从上次的下一个位置开始,继续逐个匹配,下面是程序:# include using namespace std;# include int main(){ int find(string,string ); string s1("hello world "); string s2(" wo原创 2014-02-08 17:31:28 · 964 阅读 · 0 评论 -
图的广度优先搜索
广度优先搜索的算法是:(1)从图中的某个节点v出发,依次访问该顶点的各个未曾被访问的邻接点,然后从这些邻接点出发继续访问它的邻接顶点,直到图中所有结点都被访问到(2)如果图中还有没有访问到的结点,选取一个没有访问到的结点,重复(1),直到所有结点都被访问到。图中的结点被涂成白色,灰色或者黑色,白色代表结点没有访问过,灰色代表结点被访问到,等到这个结点的所有邻接顶点被访问完时,结点的颜色变为黑色原创 2014-03-16 11:38:16 · 1227 阅读 · 1 评论 -
拓扑排序
1. 拓扑排序的定义拓扑排序是对有向无环图的顶点的一种排序,每个顶点只出现一次,如果存在一条从顶点A到顶点B的路径,那么在排序中出现在A的后面。拓扑排序是利用图中的偏序关系,得到图的全序关系。离散数学中的偏序定义是:偏序是集合S上的二元关系R,它具有自反性,反对称性和传递性。即对S中的元素a,b,有(1) aRa (自反性)原创 2014-03-16 14:09:45 · 1267 阅读 · 0 评论 -
大数相加相乘及阶乘
大数的相加相乘和阶乘操作都可能会导致结果的溢出,可以把它们转换成字符串,再进行运算,这里需要注意的是,习惯上的加法乘法运算都是从低位开始运算的,先计算个位,个位向高位进位,依次进行直到最高位。字符串表示一个数字的时候如”3476”,它的低位数字在最大下标处,为了与习惯上的操作保持一致,可以先把字符串反转,求出结果之后再把结果反转回来即可。接下来的加法操作就使用了反转的方法,乘法操作也可以使用类似的原创 2014-09-11 01:23:49 · 1667 阅读 · 0 评论 -
两个有序数组的第n大数
两个有序数组,各自含有n个元素,求第n大的元素1.顺序遍历两个数组,计数变量k统计出现的第k个元素代码如下:int getmid(int a[],int b[],int n){ int k=0; int i=0,j=0; while(i<n&&j<n) { if(a[i]<b[j]) { i++; k++; if(k==n) retu原创 2014-09-01 23:30:19 · 2621 阅读 · 0 评论 -
最长递增子序列
1. 动态规划,使用一个数组保存当前的最大递增子序列长度,时间复杂度为O(N^2)# include # include # include using namespace std;int longestsub(int a[],int n){ int *dis=(int *)malloc((n+1)*sizeof(int)); dis[0]=1; int i,j; for(原创 2014-08-09 12:20:58 · 825 阅读 · 0 评论 -
计数排序、桶排序python实现
计数排序在输入n个0到k之间的整数时,时间复杂度最好情况下为O(n+k),最坏情况下为O(n+k),平均情况为O(n+k),空间复杂度为O(n+k),计数排序是稳定的排序。桶排序在输入N个数据有M个桶时,如果每个桶的数据接近N/M个且桶内使用基于比较的排序,则桶排序的时间复杂度为O(N+M*N/M*log(N/M)).如果N=M时,每个桶只有一个数据,时间复杂度降低为O(N).桶排序的时间原创 2014-07-12 14:28:02 · 3234 阅读 · 0 评论 -
选择排序、插入排序、冒泡排序python实现
选择排序的时间复杂度为O(n^2),是不稳定的排序冒泡排序的时间复杂度最好情况下为O(n),最坏情况下为O(n^2),平均情况下为O(n^2),是稳定的排序插入排序的时间复杂度最好情况下为O(n),最坏情况下为O(n^2),,平均情况下为O(n^2),是稳定的排序1.选择排序def selection(lista): leng=len(lista); for i in rang原创 2014-07-12 09:31:06 · 1625 阅读 · 1 评论 -
各种排序算法的复杂度
一.排序算法复杂度 排序算法时间复杂度 空间复杂度(最坏情形)最好平均最坏冒泡排序O(n)O(n^2)O(n^2)O(1)插入排序O(n)原创 2014-03-22 10:18:48 · 918 阅读 · 0 评论 -
归并排序
1. 归并排序是将两个有序表合并成一个新的有序表,把待排序的数组分解成子序列,对子序列排序然后合并,归并排序使用了递归和分治的方法。合并两个有序数组A和B,采用循环遍历的方法,定义两个变量i,j,分别指向A和B的起始端,依次比较对应元素大小,选择较小的放入数组C,然后将对应的变量i或者j加1.合并数组的代码是(合并a数组中left至mid,mid+1到right的元素):void me原创 2014-03-17 23:31:37 · 1877 阅读 · 0 评论 -
堆排序
1. 堆是满足这样特性的数据结构:1.父结点的键值总是大于等于(或者小于等于)任何一个结点的值2.每个结点的左子树和右子树都是一个二叉树 最大堆是父结点的键值总是大于等于子结点键值的二叉堆,最小堆是父结点的键值总是小于等于子结点键值的二叉堆。 堆排序的基本思想是:先将待排序数组构造成堆,结点为n1,n2,n3,n4…nk,把堆顶元素(最大值)n1与堆中最后一个元原创 2014-03-17 23:31:07 · 1055 阅读 · 0 评论 -
桶排序
1. 桶排序将数据区间划分为若干个k个相同大小的子区间,称为桶。将n个数字分别送到各个桶中,如果输入数据是均匀分布在各个桶中,桶排序的时间代价是O(n),所以桶排序的速度很快。在桶排序完成后,只需对每个桶做遍历,即可输出排序的结果。即使输入数据部服从均匀分布,只要所有桶的大小的平方和与总的元素呈线性关系,桶排序也仍然可以再线性时间内完成。桶排序的伪代码是:n=A.lengthfo原创 2014-03-17 23:31:25 · 1603 阅读 · 0 评论 -
图的深度优先搜索
深度优先搜索的过程是:先选取一个顶点v,从顶点v出发,访问它的邻接顶点w,再从顶点w出发,访问w的邻接顶点,直到把所有相通的顶点访问完。如果图中还有顶点没有访问,则选取一个未访问的顶点,继续执行深度优先搜索。如果将顶点v的前驱节点记为u,深度优先搜索的前驱子图可能由多棵树组成,因为搜索可以从多个源结点重复进行,深度优先搜索的前驱子图形成的是由多颗深度优先树组成的深度优先森林。假设有图如下:原创 2014-03-16 10:37:27 · 1116 阅读 · 0 评论 -
计数排序
计数排序可以对0到k区间的整数进行排序,K为整数,排序的时间复杂度为O(n+k),它不是基于比较的算法,时间复杂度低于任何基于比较的排序算法。计数排序是稳定的排序。它的基本思想是对每一个输入元素x,输入小于x的元素个数,利用这一信息,可以直接把x放到它在输出数组中的位置上。在计数排序算法的代码中,假设输入是一个数组A[1…n],A.length=n,还需要两个数组,B[1…n]存放排序的输出,C[原创 2014-03-16 16:14:06 · 1432 阅读 · 0 评论 -
01背包问题(动态规划)
动态规划方法通常用来求解最优化问题,这类问题可以有很多可行的解,利用动态规划可以求出其中的一个最优解。可以按照下面的步骤来设计一个动态规划的算法(1)刻画最优解的结构特征(2)递归地定义最优解的值(3)计算最优解的值,可以采用自底向上的方法(4)构造出一个最优解。0-1背包问题是动态规划的常见例子,它的问题描述如下: 有背包容量为V,有n件物品,他们的体积和价值分别存放在数组v[i]和w原创 2014-03-09 11:28:27 · 1182 阅读 · 0 评论 -
快速排序
(一)C语言提供了qsort库函数,它可以对各种类型的数组包括结构体数组进行排序,它的原型是void qsort(void *base,int nelem,int width,int (*cmp)(const void *,const void *)),base是待排序的数组首地址,nelem是数组中排序的元素数量,width是排序元素的大小,cmp是函数指针,用来确定排序的顺序。qsort函原创 2014-03-08 23:00:47 · 1251 阅读 · 0 评论 -
插入排序
插入排序是比较直观的排序方法,它是在前面已排序好的i-1个元素中插入第i个元素,它是一种原位排序,即只需要使用O(1)的额外空间,最坏的情况下(数组是逆序的)时间复杂度为O(N^2),最好的情况下(数组已经排好序),时间复杂度为O(N),插入排序是一种的稳定的排序。插入排序算法的工作过程如下:(1)第一个元素可以认为已经排好序,从下一个元素开始,在已经排序的元素中从后向前遍历(2)遍历到大于tmp原创 2014-03-09 20:19:50 · 917 阅读 · 0 评论 -
数组的循环移位
有数组a[],有n个元素,实现它的循环移位,向左移位k位。有多种方法,这里仅列举三种(1)申请O(k)的附加空间,先将要移位的k位放入附加空间,把后面的元素前移,然后将这k位数加到数组的尾部。这种方法消耗的空间较多。代码为:(2)只使用O(1)的空间,定义函数,函数实现的功能是每次移动一位,k次调用函数,即可实现循环移位,这种方式需要多次调用函数,程序的效率会降低(3)使用翻转的方原创 2014-03-22 13:10:41 · 1166 阅读 · 0 评论 -
dijkstra算法
1.dijksta算法是贪婪算法的一个例子,贪婪算法分阶段地求解一个问题,每个阶段把当前的解作为最优解。dijkstra的算法思想与广度优先搜索类似,dijkstra算法可以解决非负权值有向图的单源最短路径问题,算法的结果是得到一颗最短路径树。2.dijkstra算法的基本思想是:(1)初始时,集合S仅仅包含源点s,d[s]=0,如果其它顶点w和s邻接,d[w]的值为权值,其它顶点若不和s邻接原创 2014-03-22 11:35:07 · 1139 阅读 · 0 评论 -
快速排序,归并排序,堆排序python实现
快速排序的时间复杂度1.快速排序原创 2014-07-12 13:34:56 · 1753 阅读 · 3 评论 -
和最接近0的子序列
给定整数m,n和数组x[n],找出某个I,使得x[i]+x[i+1]+x[i+2]+x[i+3]+x[i+4]…x[i+m]最接近于零。(0一.暴力解法 遍历各个i值,计算子序列的和,然后求出最接近0的int find(int a[],int n,int m) //寻找m+1个数字,使得他们的和最小{ int i=0; int thissum=0; int j原创 2014-07-26 13:35:44 · 2052 阅读 · 0 评论 -
判断线段相交
1. 叉积的计算为了确定两个点的相对位置,可以使用叉积有两个点p1和p2,如果p1xp20,则p1位于p2的逆时针方向。p1的坐标为(x1,y1),p2的坐标为(x2,y2) 则p1xp2=x1y2-x2y1确定连续线段左转还是右转的问题,也可是使用叉积有三个点p0,p1,p2 线段p0p1到p1p2左转还是右转,可以计算叉积(p1-p0)x(p2-p1)=(x原创 2014-06-07 23:11:16 · 1119 阅读 · 0 评论 -
重复出现的字符串
题目:给定一个字符串,求字符串中长度大于3的重复出现的子串。如“abcdeabcdfg”,长度大于3且重复出现的子串为abcd.解:使用后缀数组,把字符串的后缀进行排序,然后逐个比较相邻两个后缀,如果共同的长度大于3,则输出这个子串。# include # include # include int main(){ int com(char a[],char b[]); voi原创 2014-04-26 22:50:54 · 874 阅读 · 0 评论