算法设计与分析
The C
Don't tell me the sky is the limit when there are footprints on the moon.
展开
-
数据结构及算法程序设计习题篇(一)
题目:已知两颗二叉树,将它们合并成一颗二叉树。合并规则是:都存在的结点,就将结点值加起来,否则空的位置就由另一个树的结点来代替。例如:两颗二叉树是:Tree 11/ \3 2/5Tree 22/ 1 3\ 4 7合并后的树为3/ 4 5/ \ 5 4 7思想:根据题意,可以将问题划分为多个子问题,故使用递归的方法,注意程...原创 2020-08-04 21:33:20 · 1596 阅读 · 0 评论 -
两种二分查找——找到序列中的第一个出现的该元素和找到序列中最后一个出现的该元素
好了,看到标题相信你就明白这是一篇关于二分查找的文章,对于最常用的二分查找我就不在此叙述了,下面分享特殊的二分查找(其实也不特殊,算是有一点技巧吧)1.找到序列中的第一个出现的该元素2.找到序列中最后一个出现的该元素上代码,这才是你们想要的:int mid;int halfFind0(int *arr, int i, int j, int x){ while(i<j){ ...原创 2019-11-16 21:19:35 · 526 阅读 · 0 评论 -
排序专题——七大排序算法完整版
不要逼逼赖赖,有本事键盘上敲一敲好了,直接上代码!!!#include<stdio.h>#include<stdlib.h>#include<string.h>#include <malloc.h>void bubbleSort(int *arr,int n){ for(int i=0; i<n; i++){ ...原创 2019-11-16 21:11:56 · 704 阅读 · 2 评论 -
动态规划——连续邮资问题
题目:假设国家发行了n种不同面值的邮票,并且规定每张信封上最多只允许贴m张邮票。连续邮资问题要求对于给定的n和m的值,给出邮票面值的最佳设计,在1张信封上可贴出从邮资1开始,增量为1的最大连续邮资区间。例如,当n=5和m=4时,面值为(1,3,11,15,32)的5种邮票可以贴出邮资的最大连续邮资区间是1到70。思想:首先比较困难的这个题目看上去循环是没有上限的,也就是我们看似找不到循环边界,...原创 2019-11-05 21:33:51 · 2103 阅读 · 0 评论 -
输入一个数N,求出1~N中包含1的个数的总和(时间复杂度控制在O(logn))
题目:输入一个数N,求出1~N中包含1的个数的总和(时间复杂度控制在O(logn))思想:按每一位,考虑1出现的情况,找出递推式代码展示:#include<stdio.h>int main(){ int n=1034; int k,q,s=0,t=1; int l=1; q=n; while(l>0) { l=n/10; k=n%10; if (k==...原创 2019-11-05 21:31:36 · 990 阅读 · 0 评论 -
Leetcode126——给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列。
题目:给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列。转换需遵循如下规则:每次转换只能改变一个字母。转换过程中的中间单词必须是字典中的单词。说明:如果不存在这样的转换序列,返回一个空列表。所有单词具有相同的长度。所有单词只由小写字母组成。字典中不存在重复的单词。你可以假设 be...原创 2019-10-26 21:48:20 · 2572 阅读 · 0 评论 -
动态规划——扰乱字符串问题
给定一个字符串 s1,我们可以把它递归地分割成两个非空子字符串,从而将其表示为二叉树。下图是字符串 s1 = “great” 的一种可能的表示形式。在扰乱这个字符串的过程中,我们可以挑选任何一个非叶节点,然后交换它的两个子节点。例如,如果我们挑选非叶节点 “gr” ,交换它的两个子节点,将会产生扰乱字符串 “rgeat” 。我们将 "rgeat” 称作 “great” 的一个扰乱字符串...原创 2019-10-26 21:29:28 · 186 阅读 · 0 评论 -
数据结构与算法之递归系列
递归的分析与总结题目:有 5 个人坐在一起,问第 5 个人多少岁,他说比第 4 个人大 2 岁。问第 4 个人多少岁,他说比第 3 个人大2岁。问第 3 人多少岁,他说比第 2个 人大 2 岁。问第2个人多少岁,他说比第 1 个人大 2 岁。最后问第 1 个人,他说他是 10 岁。编写程序,当输入第几个人时求出其对应的年龄。题目:斐波那契数列题目:一只青蛙一次可以跳上 1 级台阶,也可以跳上...原创 2019-10-25 21:23:13 · 323 阅读 · 0 评论 -
二路归并排序
/*************************************************函数名称:mergearray*参数:a:待归并数组;first:开始下标;mid:中间下标;* last:结束下标;temp:临时数组*说明:将有二个有序数列a[first...mid]和a[mid...last]合并 ******************************...原创 2019-10-24 20:47:42 · 92 阅读 · 0 评论 -
堆排序
https://blog.csdn.net/l577217/article/details/80516654原创 2019-10-24 20:33:59 · 71 阅读 · 0 评论 -
选择排序
每次找最小或者最大的放在头或者尾部,然后遍历下去,依次把剩下元素中最小或者最大的放在第一个元素后面void swap(int *a, int *b){ int temp = *a; *a = *b; *b = temp;}void SelectSort(int *arr, int length){ if (arr == NULL || length &l...原创 2019-10-24 19:55:05 · 91 阅读 · 0 评论 -
快速排序——使用广泛!!!
void quickSort(int *nums, int left, int right){ if (left > right) return; int low = left; int high = right; int base = nums[left]; while (low < high) { whil...原创 2019-10-24 19:47:00 · 390 阅读 · 0 评论 -
双向起泡排序(冒泡排序的优化)算法
#include "stdio.h" //交换数字 void swap(int *a,int *b){ int temp; temp=*a; *a=*b; *b=temp;} //双向起泡排序 void bubbleSort(int a[],int n){ int low=0,high=n-1; int i,j; int flag=1;//一趟排序结束是否有交换 wh...原创 2019-10-24 17:00:30 · 1649 阅读 · 0 评论 -
floyd算法应用场景
Floyd算法编程题目:编程求解几座城市之间的最短距离,以及最短距离所经过的城市。#include <string.h> #include <stdio.h> #define NUMS 12 #define INF 65535 typedef struct { char vertex[NUMS]; int ed...原创 2019-10-24 16:20:31 · 1244 阅读 · 1 评论 -
prim算法
主要思想:以顶点为主线,构成生成树。把图的顶点分成两类,一类是生成树中的点(类A),另一类是图余下的点(类B)。从与类A中的点相邻接的,属于类B的点中,选择权值最小的边,把它加入到生成树中,直到图中所有顶点被加入类A。int Prim(Graph g){ int sum = 0, v; int vset[Max]; info lowcost[Max];//保存最小生成树的顶点是谁拉进来...原创 2019-10-24 15:37:18 · 91 阅读 · 0 评论 -
查找专题
题目:一个长度为L(L ≥ 1)的升序序列S,处在第[L/2]个位置的数。例如,对于两个升序序列S1=(11,13,15,17,19),则S1的中位数为15。若又有一个升序序列S2=(2,4,6,8,20),两个序列的中位数定义为它们所有元素的升序序列的中位数,则S1和S2的中位数为11.现有两个等长的用单链表存储的升序序列A和B,设计一个算法,找出两个序列A和B的中位数。代码展示:假设不是单...原创 2019-10-24 10:03:48 · 926 阅读 · 0 评论 -
树与二叉树专题
题目:原创 2019-10-13 21:49:00 · 204 阅读 · 0 评论 -
数据结构——(图)图的深度遍历(包含广度遍历完结版)
代码展示:#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <string.h>#define MaxSize 50#define MAXVERTEX 100 //最大顶点数typedef struct ArcNode //边表节点{ in...原创 2019-09-05 20:49:58 · 170 阅读 · 0 评论 -
线性表专题
题目:设计算法分段逆置线性表。例如线性表(1,2,3,4,5,6,7,8),按k等于3分段逆置得到(3,2,1,6,5,4,8,7)代码展示:(此题注意死循环,故使用r保存p的位置,防止断链或死循环)void Reverse(LinkList &L,int k){ LinkList s = L; LinkList p,q; p = s->next; ...原创 2019-09-15 22:00:07 · 149 阅读 · 0 评论 -
数据结构——设计一个算法,判断一个算数表达式中的括号是否配对。算数表达式保存在带头结点的单循环链表中,每个结点有两个域:ch和link,其中ch域为字符类型。
题目:设计一个算法,判断一个算数表达式中的括号是否配对。算数表达式保存在带头结点的单循环链表中,每个结点有两个域:ch和link,其中ch域为字符类型。思想:利用栈进行匹配,所有左括号进栈,右括号匹配栈顶元素,不匹配表达式不配对。代码展示:int kuohao(LinkList L){ char s[100],t; int top=-1; LinkList p=L...原创 2019-08-18 15:09:08 · 4387 阅读 · 0 评论 -
字符串——改变大小写问题
题目:给定一个字符串,要求改变最少数量的字符,使这个字符串中只含有大写或者小写字母,若大小写字母的个数一样,则全部变为小写字母思想:本题较为简单,计算字符串的大写或者小写的个数然后进行比较即可,再将其余的按要求变为大写或小写代码展示:#include <stdio.h>#include <stdlib.h>/*题目:给定一个字符串,要求改变最少数量的字符,...原创 2019-08-13 21:36:02 · 1532 阅读 · 1 评论 -
数据结构——(图)图的广度遍历
思想:借助栈来实现代码展示:int visited[MAXVERTEX] = {0};void visit(ALGraph G,int i){ if(visited[i]==0) { printf("访问顶点%c\n",G.adjlist[i].data); }}void BFS(ALGraph G,SqQueue &Q,int v)/...原创 2019-09-05 20:09:33 · 221 阅读 · 0 评论 -
数据结构——(树与二叉树)给定一棵二叉树,假设从二叉树的右侧观察它,将观察的结点按照从上到下输出
题目:给定一棵二叉树,假设从二叉树的右侧观察它,将观察的结点按照从上到下输出思想:利用层次遍历,从上到下依次输出这一层的最后一个元素即可,注意将层数与结点一起入队代码展示:void fromTheSide(BiTree T,SqQueue &Q){ if(T==NULL) { return; } EnQueue(Q,T,1); ...原创 2019-09-04 14:55:14 · 574 阅读 · 0 评论 -
数据结构——(树与二叉树)二叉树的层次遍历
1.递归方式代码展示:void levelOrder(BiTree T,SqQueue &Q){ if(T==NULL) { return; } EnQueue(Q,T); while(QueueEmpty(Q)==0) { BiTree x; DeQueue(Q,x); ...原创 2019-09-03 21:00:33 · 123 阅读 · 0 评论 -
数据结构(栈)——设有两个栈S1,S2都采用顺序栈方式,并且共享一个存储区[O..maxsize-1],为了尽量利用空间,减少溢出的可能,可采用栈顶相向,迎面增长的存储方式。
题目:设有两个栈S1,S2都采用顺序栈方式,并且共享一个存储区[O…maxsize-1],为了尽量利用空间,减少溢出的可能,可采用栈顶相向,迎面增长的存储方式。试设计有关结构和操作。思想:一个栈底在最左侧,另一个栈底在最右侧,判断两个栈的top相减大于1则可以继续操作代码展示:#include <stdio.h>#include <stdlib.h>#includ...原创 2019-08-20 16:06:59 · 10251 阅读 · 1 评论 -
数据结构(栈)——设计算法,判断两个栈中的序列是否是逆序列,比如 1,2,3 和3,2,1
题目:设计算法,判断两个栈中的序列是否是逆序列,比如 1,2,3 和3,2,1思想:借助栈的存取特点代码展示:#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <string.h>typedef struct Stack{ int data[10...原创 2019-08-20 15:46:25 · 340 阅读 · 0 评论 -
算法之——众数重数问题
题目:设数组A是n个数的序列,其中出现次数最多的数称为众数,他出现的次数叫做他的重数,设计算法求A的众数和重数(注意考虑多个重数的情况)思想:先进行一遍排序,提高效率,再进行众数重数的比较,结合数据结构的单链表,对多个众数进行处理。代码展示:#include <stdio.h>#include <stdlib.h>#include <malloc.h>...原创 2019-08-11 14:49:52 · 1516 阅读 · 0 评论 -
设计算法统计A中位于区间(L,U)的所有x的个数(用递归和分治来做)
题目:设有序数组A有n个数,给定选取其中的两个元素L和U,L<U,设计算法统计A中满足L<x<u的所有x的个数(用递归和分治来做)思想:二分查找法结合递归思想,找到左右边界的下标相减即可。代码展示:#include <stdio.h>#include <stdlib.h>/* * 题目:设有序数组A有n个数,给定选取其中的两个元素L和U,L...原创 2019-08-11 11:39:10 · 1045 阅读 · 0 评论 -
数据结构——在一个有序表中,现在要插入一个元素,要求在插入后不改变表的有序性
题目:在一个有序表中,现在要插入一个元素,要求在插入后不改变表的有序性(要求采用一种时间复杂度较低的算法,所采用的的数据结构不限)思想:本题有多种做法,但是最少的时间复杂度是申请一个新的顺序表,一次比较后插入,时间复杂度为O(N),这是典型的以空间换时间的做法。代码展示:#include<stdio.h>#include<stdlib.h>#define Ele...原创 2019-08-13 21:00:40 · 2039 阅读 · 0 评论 -
LeetCode19——给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点(给定的 n 保证是有效的,你能尝试使用一趟扫描实现吗?)
题目:给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点(给定的 n 保证是有效的,你能尝试使用一趟扫描实现吗?)思想:采取双重遍历肯定是可以解决问题的,但题目要求我们一次遍历解决问题,那我们的思路得发散一下。我们可以设想假设设定了双指针 p 和 q 的话,当 q 指向末尾的 NULL,p 与 q 之间相隔的元素个数为 n 时,那么删除掉 p 的下一个指针就完成了要求。代码展示:...原创 2019-08-18 17:02:06 · 579 阅读 · 0 评论 -
LeetCode06——Z字形输出问题
题目:将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:L C I RE T O E S I I GE D H N之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。请你实现这个将字符串进行指定行数变换的函数。...原创 2019-07-24 21:50:44 · 524 阅读 · 0 评论 -
LeetCode292之Nim游戏
题目:你和你的朋友,两个人一起玩 Nim游戏:桌子上有一堆石头,每次你们轮流拿掉 1 至 3 块石头,拿掉最后一块石头的人就是获胜者,你作为先手。你们是聪明人,每一步都是最优解。编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。示例:输入: 4输出: false思想:如果堆中有 4 块石头,那么你永远不会赢得比赛;因为无论你拿走 1 块、2 块还是 3 块石头,最后一块石头...原创 2019-07-24 20:57:52 · 256 阅读 · 0 评论 -
LeetCode106:数据结构(树)——从中序与后序遍历序列构造二叉树
题目:思想:递归,注意细节代码展示:/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */struct TreeNode* buildTree...原创 2019-08-21 19:13:08 · 104 阅读 · 0 评论 -
数据结构——长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素
题目:长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素。思想:记录等于X的值的个数i,遇到不是X的位置就把值放到前面i个位置上代码展示:#include<stdio.h>#include<stdlib.h>#define ElemType int#define InitSize 100#de...原创 2019-08-17 15:39:27 · 5611 阅读 · 0 评论 -
数据结构(树与二叉树)——给定一棵二叉树,将该二叉树就地转化为单链表,单链表中结点顺序为二叉树前序遍历顺序
题目:给定一棵二叉树,将该二叉树就地转化为单链表,单链表中结点顺序为二叉树前序遍历顺序思想:如果右子树不为空,则右子树最后肯定为左子树最后一个靠右的孩子节点的右子树,而左子树最后成为整棵树的右子树。这样,首先判断左子树是否为空,不为空就寻找到树根的左孩子节点,然后寻找该节点是否有右孩子,如果有继续寻找,直到找到属于叶子节点的右孩子,此时,该节点的右子树“指向”当前树的右子树,并将当前左子树变为树...原创 2019-09-03 19:48:10 · 258 阅读 · 0 评论 -
数据结构——(树与二叉树)已知二叉树,找出二叉树中给定两个结点的最近公共祖先
题目:已知二叉树,找出二叉树中给定两个结点的最近公共祖先思想:遍历二叉树,利用栈保存结点,然后对栈进行查找代码展示:void findWay(BiTree T,Stack &S,int x,int &finish){ int e; if(T==NULL || finish==1) { return ; } Push(S...原创 2019-09-03 15:52:40 · 455 阅读 · 0 评论 -
数据结构——(树与二叉树)给定一个二叉树和整数sum,找出所有根节点到叶子结点的路径,这些路径上的结点值累加和为sum
题目:给定一个二叉树和整数sum,找出所有根节点到叶子结点的路径,这些路径上的结点值累加和为sum思想:遍历二叉树的思想,结合栈的使用代码展示:void EqualSum(BiTree T,Stack &S,int sum,int &x){ if(T==NULL) { return; } Push(S,T->data);...原创 2019-09-03 14:44:19 · 1285 阅读 · 1 评论 -
LeetCode61——给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
题目:给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。思想:假设n个元素,即把后面n-k个元素依次头插即可代码展示:/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */st...原创 2019-08-18 15:18:12 · 3058 阅读 · 0 评论 -
数据结构——有一个带头结点的单链表,设计算法使其元素递增有序。(只改变指针)
题目:有一个带头结点的单链表,设计算法使其元素递增有序。思想:注意断链!!!!代码展示:void Sort(LinkList &L){ if(L->next==NULL || L->next->next==NULL) { return ; } LinkList p,pre,q; p=L->next-&...原创 2019-08-18 14:10:24 · 13130 阅读 · 12 评论 -
数据结构——将两个有序链表合并成一个有序链表(只移动指针)
问题:将两个有序链表合并成一个有序链表代码展示:void Merge(LinkList &P,LinkList &Q,LinkList &L){ LinkList p = P->next; LinkList q = Q->next; LinkList l = L; while(p!=NULL && q!=NU...原创 2019-08-17 17:29:15 · 1408 阅读 · 5 评论