算法
想吃糯米藕
这个作者很懒,什么都没留下…
展开
-
进阶版:找出数组中第k小的数
常用的有三种方法:(假定数组下标从1开始存储数据)第一种方法:先对数组进行升序排序,再直接输出L(k)。最容易想到的也是最容易实现的,不过也是平均时间复杂度最大的,为O(nlog2n)。第二种方法:利用小根堆的特性,先线性时间内建立小根堆,再不断调整每次堆顶元素都是剩下序列中的最小元素。整体实现不算麻烦,平均时间复杂度为O(n+klog2n)。第三种方法(好多文章没讲清楚具体怎样递归子区间):从数组L[1…n]中选择枢轴pivot(或者随便选一个)进行和快速排序一样的划分操作后,表L[1…n]原创 2022-11-18 15:29:16 · 519 阅读 · 1 评论 -
蛇形填数(理解起来超简单!!!)
话不多说,先放原题。怎么说呢,蛇形填数这个填充矩阵的时候方法可能不是很好想,还是很抽象的,但是这个方法绝对非常好理解(边界模拟法)。首先,咱们先确定矩阵的四个边界,在赋值完最外层边界后,再往里赋值里面的一个子矩阵,不断循环,直至填充完整个矩阵。AC代码(建议先“食用”截图自己打一遍,带注释的哦):文本格式(一定要自己写一遍哈):#include<iostream>using namespace std;const int N=110;int q[N][N],n,m;in原创 2021-01-17 22:38:13 · 4851 阅读 · 4 评论 -
DFS之排列数字
解题思路:题目要求是输出所有方案,并且是按字典序,很自然的想到DFS(dfs的主要思想便是一种较为暴力的搜索,就是一条路走到底,走不下去了再进行回溯,有时候还伴随剪枝操作,非常适合一些暴力搜索可以解决的问题)。AC代码:#includeusing namespace std;const int N=10;int path[N],n;bool st[N];void dfs(int u){if(u==n){for(int i=0;i<n;i++)cout<<path[.原创 2020-11-01 22:41:49 · 228 阅读 · 0 评论 -
算法:DFS之 n-皇后问题(两种不同的方法)
//第一种方法思路:根据每行每列每对角线的关系进行从头行开始搜索#includeusing namespace std;const int N=20;char q[N][N];bool l[N],l[N],dg[N],udg[N];int n;void dfs(int u){if(u == n){for(int i=0;i<n;i++){for(int j=0;j<n;j++)cout<<q[i][j];cout<<endl;}co..原创 2020-11-01 22:36:37 · 151 阅读 · 0 评论