算法
文章平均质量分 67
zycxnanwang
这个作者很懒,什么都没留下…
展开
-
二叉树前序、中序、后序遍历非迭代解法
二叉树前序、中序、后序遍历非迭代解法经常会有面试官,让你手撕二叉树的前序、中序、后序遍历,当你简单得写了递归的方法,面试官看了看,慢悠悠得抛出你会迭代的解法吗?,这时候就需要阅读我这篇文章了。前序和中序遍历,解决方法类似,都是使用栈解决的。后序遍历稍微复杂一点。二叉树前序遍历class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer>原创 2020-09-24 19:56:34 · 585 阅读 · 0 评论 -
并查集:刷题必备神器
并查集:刷题必备神器面试的时候,面试官出了一道并查集的算法题,辛亏以前复习过。写下这篇文章,加深自己的理解,同时希望帮助到正在准备面试的你。觉得好,可以收藏一波。定义动态维护若干个不重叠的集合,并支持合并与查询操作的一种数据结构。下面以树作为并查集逻辑结构,具体代码实现使用数组。详细讲述并查集的初始化、合并和查询操作并查集的初始化开始各个节点的父元素均为自身,各个集合元素数量...原创 2020-04-17 00:39:42 · 1632 阅读 · 11 评论 -
找两个排序数组的中位数
找两个排序数组的中位数令两个排序数组大小分别是m,n如果m+n是奇数,中位数就是第m+n2+1\frac{m+n}{2}+12m+n+1个元素如果m+n是偶数,中位数就是第m+n2\frac{m+n}{2}2m+n个元素和第m+n2+1\frac{m+n}{2}+12m+n+1个元素的平均值自然而然得,问题转换为求两个排序数组中第kkk大的元素求排序数组中第k大的元素的算法...原创 2018-12-19 12:18:31 · 832 阅读 · 0 评论 -
选择排序,冒泡排序
选择排序思想 第1趟,在待排序记录r[1]~r[n]中选出最小的记录,将它与r[1]交换;第2趟,在待排序记录r[2]~r[n]中选出最小的记录,将它与r[2]交换;以此类推,第i趟在待排序记录r[i]~r[n]中选出最小的记录,将它与r[i]交换,使 有序序列不断增长直到全部排序完毕。 冒泡排序思想 比较相邻的元素。如果第一个比第二个大,就交换他们两个 对每一对相...原创 2018-07-30 16:01:27 · 193 阅读 · 0 评论 -
归并排序
归并排序 归并排序,是一种效率十分高的排序算法,并且它是稳定的,时间复杂度为O(n*log(n)) 归并排序主要的思想就是分治(问题转换为子问题)算法过程 假设我们有一个没有排好序的序列,那么首先我们使用分割的办法将这个序列分割成一个个已经排好序的子序列。然后再利用归并的方法将一个个的子序列合并成排序好的序列。分割和归并的过程可以看下面的图例。 时间复杂度 总时间原创 2017-08-11 20:29:10 · 263 阅读 · 0 评论 -
堆排序
堆排序知识点 堆分为大顶堆,小顶堆。 大顶堆的定义:每个节点的值都不大于其父节点的值 小顶堆的定义:每个节点的值都不小于其父节点的值 左边大顶堆, 右边小顶堆 堆排序是一种选择排序,时间复杂度是O(n*log(n)), 也是一种不稳定的排序方法 从图中可以看出大顶堆根节点的值最大 对全数组A[n]构建大顶堆 A[0原创 2017-08-11 19:36:20 · 304 阅读 · 0 评论 -
快速排序
快速排序 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列,快速排序的时间复杂度为O(n*log(n)),最坏的情况是O(n^2),快速排序是不稳定的复杂度的证明 最优情况 在最优情况下,Partition每次都划分得很均匀,如果排原创 2017-08-11 12:06:04 · 555 阅读 · 1 评论 -
插入排序
插入排序 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。C++代码:#include<iostream>using namespace std;int insertSort(int *a, int len) { int i = 1, j = 0; int原创 2017-08-11 10:06:42 · 230 阅读 · 0 评论 -
拼多多笔试题-掷骰子
拼多多笔试题题目 掷骰子掷n个不同面数的骰子,以最大点数为结果,求点数的期望。一共有n个骰子第i个骰子面数为nin_ini,点数为[1,nin_ini],每个面的概率相同,同时掷这n个骰子,所有骰子中的最大点数为最终点数,求骰子投出的期望值example1输入22 2输出1.75example2输入41 2 3 4输出2.875分析开始想暴力解,...原创 2019-10-01 17:12:03 · 2611 阅读 · 1 评论 -
腾讯2020校招笔试题-小Q放假
腾讯2020校招笔试题题目公司给小Q放了n天的假,他有个奇怪的习惯:不会连续两天工作或段炼只有当公司开业,小Q才能去工作,只有当健身房营业时,小O才能去健身,小Q一天只能干一件事.给出假期中公司,健身房的营业情兄,求小Q最少需要体息几天输入描述第ー行一个数表示放假天数n第二行n个数字,数字为0或者1,第i个数表示公司在第1天是否营业第三行n个数字,数字为0或者1,第i个数表示健身...原创 2019-10-02 00:55:50 · 1887 阅读 · 2 评论 -
小红书2020笔试题-迷宫游戏
小红书2020笔试题迷宫游戏薯队长最近在玩一个迷宫探索类游戏,迷宫是一个N∗NN*NN∗N的矩阵形状,其中会有一些障碍物,禁止通过。这个迷宫还有一个特殊的设计,它的左右边界以及上下边界是连通的,比如在(2,n)(2,n)(2,n)的位置继续往右走一格可以到(2,1)(2,1)(2,1),在(1,2)(1,2)(1,2)的位置继续往上走一格可以到(n,2)(n,2)(n,2)。请问薯队长从...原创 2019-10-02 00:57:00 · 1375 阅读 · 3 评论 -
最长公共子序列
最长公共子序列最长公共子序列是经典的动态规划问题,下面从动态规划的两个重要特征,最优子结构和子问题重叠来分析问题,同时要保证子问题的完整性。最优子结构最优子结构的意思就是原问题的最优解中包含子问题的最优解原问题:X=(x1,x2,x3,...xm)X=(x_1, x_2, x_3,...x_m)X=(x1,x2,x3,...xm), Y=(y1,y2,y3...yn)Y...原创 2018-12-18 20:58:11 · 446 阅读 · 0 评论 -
完全背包
完全背包题意有 N 种物品和一个容量为 V 的背包,每种物品都有无限件可用。放入第 i 种物品的费用是 Ci,价值是 Wi。求解:将哪些物品装入背包,可使这些物品的耗费的费用总和不超过背包容量,且价值总和最大。分析完全背包和0/1背包的不同之处在于每件物品有无限件可用,而不是一件。状态转移方程为f(n,m) = max{f(n+1,m),f(n,m−wn)+vn...原创 2018-12-28 20:18:00 · 228 阅读 · 0 评论 -
prim算法
prim算法 最小生成树算法 算法步骤 输入:一个加权连通图,其中顶点集合为V,边集合为E; 初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {},为空; 重复下列操作,直到Vnew = V: 在集合E中选取权值最小的边C++代码#include<iostream>using namespace std;#include原创 2017-08-23 13:32:09 · 563 阅读 · 0 评论 -
克鲁斯卡尔算法
克鲁斯卡尔算法基本思想 先构造一个只含 n 个顶点、而边集为空的子图,把子图中各个顶点看成各棵树上的根结点,之后,从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树,则将其加入子图,即把两棵树合成一棵树,反之,若该条边的两个顶点已落在同一棵树上,则不可取,而应该取下一条权值最小的边再试之。依次类推,直到森林中只有一棵树,也即子图中含有 n-1 条边为止。时间复杂度为为O(e^原创 2017-08-23 18:56:10 · 585 阅读 · 0 评论 -
中缀转后缀并求值(简单计算器的核心)
中缀转后缀并求值做一个简单的计算器,关键的技术就是表达式求值#### 将中缀表达式转化为后缀表达式 string s 为原始表达式, stack S作为操作符栈, vector V存储后缀表达式结果 如果是操作字符,分一下几种情况 (优先级说明:乘除的优先级,高于加减;’)’的优先级最低,‘(’的优先级最高) 如果字符栈为空,直接将操作符入栈 S 如果栈顶原创 2017-09-19 15:22:36 · 2097 阅读 · 0 评论 -
0-1背包问题
0-1背包问题问题描述给定nnn个物品和一个背包, 物品iii的重量是wiw_iwi,价值是viv_ivi,背包容量为CCC, 问如何选择装入背包的物品, 使得装入背包的物品的总价值最大?(针对某个物品,只能选择放入,或者不放入,不能部分放入)动态规划的两要素最优子结构通过分析,我们可以知道假设{x1,x2,x3,...xn}是原问题的最优解假设\{x_1, ...原创 2018-10-22 17:11:27 · 194 阅读 · 0 评论 -
最长回文子序列
最长回文子序列题目给定一个字符串s,找到其中最长的回文子序列例如输入:bbbab,最大回文子序列长度为4,结果为bbbb分析 题目其实和最大公共子序列很相似。比较字符串的第一个字符s1s_1s1和最后一个字符sns_nsn,如果它们相等。则原问题F(1,n)F(1,n)F(1,n)最优解为F(2,n−1)+2F(2,n-1)+2F(2,n−1)+2,F(2,n−1)F(2,n-1...原创 2018-12-26 19:10:49 · 275 阅读 · 0 评论 -
最长回文子串
最长回文子串题目给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: "babad"输出: "bab"注意: "aba" 也是一个有效答案。分析 可以用动态规划来做,复杂度为O(n2)O(n^2)O(n2),复杂度太高,以后改进!通过分析我们可以知道,长度为1的子字符串,是回文,长度为2的子字符串,如果两个字符相等是回文串...原创 2018-12-26 19:11:57 · 169 阅读 · 0 评论 -
KMP算法
#递归求next数组def next(p): nextArr = [0 for i in range(len(p))] #规定 next[0] == -1 nextArr[0] = -1 j, k = 0, -1 while(j < len(p)-1): if k == -1 or p[j] == p[k]: ...原创 2018-12-21 17:43:56 · 160 阅读 · 0 评论 -
最大连续子数组和
最大连续子数组和(POJ1050)最大子序和,可以简单地用基本的编程逻辑解决。但这道问题,其实是一道动态规划的问题分析令F(i)F(i)F(i)是以元素arr[i]结尾的连续子数组的最大值(arr是原数组),则以下公式成立F(i)=F(i−1)+arr[i] if F(i−1)&gt;=0F(i)=arr[i] &n...转载 2018-12-22 23:01:36 · 199 阅读 · 0 评论 -
迪杰斯特拉算法
迪杰斯特拉算法 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。注意该算法要求图中不存在负权边。算法过程 初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶点,即:U={其余顶点},若v与U中顶点u有边,则对如下连通图求单源点路径C++代码#includ原创 2017-08-12 17:27:02 · 429 阅读 · 0 评论