
算法设计与分析
算法
scgg
心之所向,至死方休
展开
-
算法每日刷
每日算法DAY One: 数组交集问题DAY Two: 最长公共前缀DAY Three:无重复字符的最长子串DAY One: 数组交集问题题目描述:给定两个数组,编写一个函数来计算它们的交集。示例://示例1输入: 1 2 2 1 2 2输出: 2 2//示例2输入: 4 9 5 9 4 9 8 4输出: 4 9说明:可以不考虑输出结果的顺序重复的元素按重复的次数输出思路:如果使用双重for循环的话需要先将数组去重,使用map容器将元素值与元素个数存储起原创 2020-08-23 23:06:23 · 232 阅读 · 0 评论 -
图的m着色问题
【题目描述】给定无向连通图 G 和 M 种不同的颜色,用这些颜色为图 G 的各顶点着色,每个顶点着一种颜色。如果有一种着色法使 G 中每条边的 2 个顶点着不同的颜色,则称这个图是 M 可着色的。图的 M 着色问题是对于给定图 G 和 M 种颜色,找出所有不同的着色法。对于给定的无向连通图 G 和 M 种不同的颜色,编程计算图的所有不同的着色法。【输入】第一行有 3 个正整数 ...原创 2019-11-03 21:09:39 · 436 阅读 · 0 评论 -
汉诺塔问题
问题描述有a, b, c三座塔,在a塔上有n个圆盘,这些圆盘自上而下,从小到大的叠放在一起,现在要把圆盘从a移到b上,每次只能移动一个圆盘,并且任何时刻都不能将大的圆盘压在小的圆盘上。解题思路首先设法将a上的前n-1个圆盘借助c移动到b上; 将a上的最后一个圆盘移动到b上; 借助c移动的过程中,将c上的n-1个圆盘借助b移动到a上,然后重复步骤一。解题代码#include...原创 2019-11-03 11:45:59 · 270 阅读 · 0 评论 -
递归的概念:函数递归过程
定义直接或间接地调用自身的算法称为递归算法。用函数自身给出定义的函数称为递归函数。使用递归技术往往会使代码更简洁,使算法的描述更清晰且容易理解。举例例 1:阶乘函数阶乘函数递归的定义为:当n=0时,n!=1,这是这个函数的初始条件,是非递归定义的,是此递归函数的退出条件。这个递归函数在执行时,会不断的调用自身,寻找自身的值减一后的阶乘值,直到自身值减一为0时,此时函数递归到了最后一...原创 2019-11-02 17:00:45 · 1226 阅读 · 0 评论 -
递归与分治之全排列
参考教学视频:https://www.bilibili.com/video/av9830088?from=search&seid=107948597631354052代码段包含两个函数: 一:Swap函数:用于数值交换; 小提示:在头文件algorithm中已经封装好了swap函数,增加头"#include<algorithm>"可直接调用s...原创 2019-08-27 14:24:00 · 612 阅读 · 0 评论 -
C++:字母按字典序的全排列
要点:相比于普通的递归全排列,按字典排序的全排列需要用到排序函数(下面代码中的Sort函数),要为字符先排好序(按ASCLL值),再进行递归排列。普通的递归全排列(可与本文的代码比较来看):https://blog.youkuaiyun.com/qq_40760732/article/details/100098306注意:Perm(char list[],int p,int q)做的是数组list[...原创 2019-08-29 21:07:02 · 4894 阅读 · 0 评论 -
C++算法:合并(归并)排序——递归与非递归
一、带递归的合并排序#include<iostream>using namespace std;void copy(int a[], int b[], int left,int right){ for (int i = left; i<= right; i++) a[i] = b[i];}void meg(int a[], int b[], int l, i...原创 2019-09-02 16:14:50 · 3064 阅读 · 0 评论 -
线性时间选择(C++):求第k小的数
方法一: 思想:首先对整个数组进行划分,利用Partition函数,以数组中某个数为基准(这里以首项为标准)将数组划分为两部分——左边部分的所有数都小于基准,右边部分都大于基准,并返回基准数的下标值。 然后,如果要找到第k小个数,就将k的大小与数组左半边元素的个数(若为j,包括基准)进行比较,如果k小于j,则对左边部分进行递归,找第k小个数;若k大于j,...原创 2019-09-04 15:43:24 · 6486 阅读 · 3 评论 -
快速排序
思想:找出一个中间值,使数组的左边都小于此数,右边都大于此数,然后对左右两边分别进行递归,直到只有一个元素为止。分析一下Partition函数:以数组 a = {3 2 5 1 4 6 9}为例,首先以3为基准,令x=a[0](一般写为x=a[left], left为数组左边的最小下标值),i= 0,j=6+1(最大下标值加一),接着进循环。i自增1,判断a[i]是...原创 2019-09-04 16:39:06 · 141 阅读 · 0 评论