
算法设计与分析
同志啊为人民服务!
我的快乐我做主!
展开
-
哈夫曼编码是如何达到压缩的?
1.基本概念应该搞清三个概念:哈夫曼树,哈夫曼编码和哈夫曼压缩具体请看下图a)哈夫曼树b)哈夫曼树的构造过程和哈夫曼编码c)哈夫曼压缩解释:哈夫曼编码是怎么达到压缩的?如上图所示,把结点权值看作结点出现的次数。字符a出现45次,字符b出现13次,字符c出现12次,字符d出现16次,字符e出现9次,字符f出现5次。对abcdef六个字符编码,如果采用等长编码,至少一个字符需要3位。这样对这么多字符编码就需要3*(45+13+12+16+9+5)=300位。而采用如图所示的哈夫曼编码就只需原创 2021-08-24 22:20:46 · 559 阅读 · 0 评论 -
二叉树先序中序后序遍历
1.题目:牛客网 NC45 (实现二叉树先序,中序和后序遍历)描述分别按照二叉树先序,中序和后序打印所有的节点。示例1输入:{1,2,3}返回值:[[1,2,3],[2,1,3],[2,3,1]]2.二叉树的遍历a.先序遍历:如果二叉树为空,什么也不做。否则:1)访问根节点2)先序遍历左子树3)先序遍历右子树b.中序遍历:如果二叉树为空,什么也不做。否则:1)中序遍历左子树2)访问根节点3)中序遍历右子树c.后序遍历:如果二叉树为空,什么也不做。否则:1)后序遍历原创 2021-08-24 17:28:20 · 286 阅读 · 0 评论 -
寻找第K大(借用快排思想)
1.题目:牛客网 NC88 (寻找第K大)描述有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。给定一个整数数组a,同时给定它的大小n和要找的K(1<K<n),请返回第k大的数(包括重复的元素,不用去重),保证答案存在。要求时间复杂度O(n)示例1输入:[1,3,5,2,2],5,3返回值:2 2.解题思路这题给了提示,可以借用快排的思想。同时要注意对事件复杂度的要求是O(n)。对于快排不熟悉的,建议看下我的这篇博文:快速排序详细讲解和代码实现先给大家原创 2021-08-23 17:33:31 · 172 阅读 · 0 评论 -
快速排序详细讲解和代码实现
1.快速排序快排的基本思想是分治策略:在待排序表L[1…n]中任意取一个元素pivot作为基准。通过一趟比较大小将待排序表L[1…n]划分为独立的两部分L[1…k-1]和L[k+1…n],使得L[1…k-1]中所有元素小于pivot,L[k+1…n]中所有元素大于或等于pivot。,pivot放在了最终位置L[k]上,这样就完成了第一趟快排。然后,再分别递归地对两个字表重复上述过程,直至每部分只有一个元素或空为止。这样,排序完成。2.代码实现快排函数为QuickSort(),划分函数为Partiti原创 2021-08-23 11:43:42 · 813 阅读 · 0 评论 -
合并两个有序数组(双指针解题)
1.题目:牛客网 NC22 (合并两个有序的数组)描述给出一个整数数组A和有序的整数数组B,请将数组B合并到数组A中,变成一个有序的升序数组注意:1.可以假设A数组有足够的空间存放B数组的元素,A和B中初始的元素数目分别为m和n,A的数组空间大小为m+n2.不要返回合并的数组,返回是空的,将数组B的数据合并到A里面就好了3.数组A在[0,m-1]的范围也是有序的例1:A: [4,5,6,0,0,0],m=3B: [1,2,3],n=3合并过后A为:A: [1,2,3,4,5,6]原创 2021-08-21 21:31:27 · 2437 阅读 · 0 评论 -
最长无重复子数组/最长无重复字串详细解法
1.题目:牛客网NC41( 最长无重复子数组)描述给定一个数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组 示例输入:[2,2,3,4,3]返回值:3说明:[2,3,4]是最长子数组 2.滑动窗口法解题此类题目,我先带大家理一下思路。所谓滑动窗口法是指设置两个指针,left和right表示窗口的两边。右指针往前走,有指针每走原创 2021-08-21 15:05:15 · 2638 阅读 · 0 评论 -
用两个栈实现队列
1.题目:牛客网NC76(NC76 用两个栈实现队列)描述用两个栈来实现一个队列,分别完成在队列尾部插入整数(push)和在队列头部删除整数(pop)的功能。 队列中的元素为int类型。保证操作合法,即保证pop操作时队列内已有元素。示例:输入:["PSH1","PSH2","POP","POP"]返回:1,2解析:"PSH1":代表将1插入队列尾部"PSH2":代表将2插入队列尾部"POP“:代表删除一个元素,先进先出=>返回1"POP“:代表删除一个元素,先进先出=>原创 2021-08-20 11:25:22 · 219 阅读 · 0 评论 -
二分查找法的递归和非递归实现(C++)
文章目录1.二分查找法思想2.算法使用前提3.递归实现(C++)4.非递归实现(C++)1.二分查找法思想折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是:(这里假设数组元素呈升序排列)将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止;如 果x<a[n/2],则我们只要在数组a的左半部继续搜索x;如果x>a[n/2],则我们只要在数组a的右半部继续搜原创 2021-08-06 21:04:49 · 2394 阅读 · 0 评论 -
贪心算法的基本要素
文章目录1.前言2.贪心算法简介3.贪心算法的基本要素3.1贪心选择性质3.2 最优子结构性质3.3 贪心算法与动态规划算法的差异4.贪心算法的基本步骤5.一些经典的贪心算法问题1.前言本文着重讨论可以用贪心算法求解的问题的一般特征。对于一个具体的问题,怎么知道是否可用贪心算法解此问题,以及能否得到问题的最优解呢?这个问题很难给予肯定的回答。但是,从许多可以用贪心算法求解的问题中看到这类问...原创 2019-10-29 21:13:53 · 21789 阅读 · 2 评论 -
动态规划算法的基本思想-求解步骤-基本要素和一些经典的动态规划问题【干货】
文章目录1.序2.动态规划的基本概念[^1]3.动态规划算法的基本思想[^2]4.动态规划的求解步骤[^2]5.动态规划算法的基本要素[^2]5.1 最优子结构5.2 重叠子问题6.一些经典的动态规划问题1.序近期笔者会写一些博客,与大家共同讨论一些经典的算法思想。这篇文章主要介绍动态规划算法的基本思想、使用动态规划算法求解问题的基本步骤、动态规划算法的两个基本要素以及一些经典的动态规划问题。...原创 2019-10-27 17:28:33 · 53108 阅读 · 13 评论