![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
我是菜小新
这个作者很懒,什么都没留下…
展开
-
分治1——输出前m个大的数
输出n个数中前m个大的数可以采用先排序在取前m个大的数,这个最好的时间复杂度为O(nlogn)。可以利用快排的思想加快时间复杂度,下面算法时间复杂度为O(n+mlogm),若m<<n时,则时间复杂度约为O(n)。#include<iostream> using namespace std; int a[100]; void swap(int &a, int &a...原创 2018-04-16 21:42:44 · 834 阅读 · 0 评论 -
分治2——求排列的逆序数
最笨的方法时间复杂度为O(n2),采用利用二分归并排序算法思想,时间复杂度为O(nlogn)#include<iostream> using namespace std; int a[1000], temp[1000]; long long sum = 0; void merge(int a[], int s, int m, int e, int temp[]) { int pb...原创 2018-04-16 21:52:06 · 675 阅读 · 0 评论 -
动态规划之最长上升子序列
北大郭炜老师讲的能采用动态规划求解问题的特点:(1)问题具有最优子结构的性质;(2)无后效性。实现动态规划的三个步骤:(1)讲原问题分解为子问题;(2)确定状态以及初始状态(边界值);(3)状态转移方程(“人人为我”递推型)。第一步的子问题就是a[i]为终点的最长上升子序列。#include<iostream> #include<algorithm> using names...翻译 2018-04-12 16:37:13 · 659 阅读 · 0 评论 -
动态规划之最长公共子序列
#include<iostream> #include<algorithm> using namespace std; const int MAXN = 1010; char s1[MAXN], s2[MAXN]; int maxLen[MAXN][MAXN]; // 确定状态maxLen int main() { cin >> s1 >> s...原创 2018-04-12 17:01:26 · 129 阅读 · 0 评论 -
栈的应用——就近匹配问题
就近匹配是栈最典型的应用,最常见的就是括号匹配。 思路:遇到一个左括号就压栈;遇到一个右括号就先看栈是否为空,不为空就弹栈,为空就输出不匹配;遍历一遍后检查下栈是否为空,若不为空,输出不匹配。 #include <iostream> #include <stack> #include <string> using namespace std; type...原创 2018-08-19 10:57:03 · 315 阅读 · 0 评论 -
栈的应用——中缀表达式转后缀表达式
中缀转后缀过程: 1. 对于数字:直接输出 2. 对于符号: 2.1 左括号:进栈 2.2 运算符号:(与栈顶符号进行优先级比较,若栈顶符号优先级低:此符号进栈;若栈顶符号优先级不低:将栈顶符号弹出并输出,之后进栈) 若是乘除直接进栈; 若是加减,与栈顶比较,若栈顶是乘除,直接输出,否则进栈。 ...原创 2018-08-19 16:27:49 · 306 阅读 · 0 评论 -
二叉树先中后序遍历(递归与非递归)
非递归利用栈 #include <iostream> #include <stack> using namespace std; typedef struct BinaryTree { char data; BinaryTree* lchild; BinaryTree* rchild; }BinaryTree; typedef struct MYDATA {...原创 2018-08-19 17:40:45 · 309 阅读 · 0 评论 -
链表倒置(递归与非递归)
非递归(迭代):从前向后遍历 递归:从后向前回溯 #include <iostream> #include <string> using namespace std; struct LinkNode { int data; LinkNode* next; }; // 迭代 LinkNode* ReverseLink(LinkNode* head) { Li...原创 2018-08-20 20:53:05 · 731 阅读 · 0 评论 -
网易第三次笔试第二题(深度优先搜索)
题目描述: 本公司有很多团队,现在要将关系紧密的团队放到同一个部门。给定一个M*M的二维数组,如: 4 0 1 1 0 1 0 0 0 1 0 0 1 0 0 1 1 其中4表示二维数组的大小,1代表一个团队,上下或左右相连的1(团队)表示其关系紧密,求最后分出的部门数。 输入描述: 第一行第一个整数表示M(M<1000), 后面每一行表示团队之间的关系分布,如上所示的数...原创 2018-09-09 16:57:43 · 284 阅读 · 0 评论