自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

清文的博客

编程渣,努力成为程序猿

  • 博客(36)
  • 收藏
  • 关注

原创 MIT算法导论-第五讲-线性时间排序

在比较排序算法中,在最坏情况下,都需要做Ω(nlgn)此比较。合并排序和堆排序以及随机快速排序平均情况和最坏情况下达到O(nlgn),因此合并排序和堆排序以及随机快速排序是渐进最优的。1.决策树的概念及如何用决策树确定排序算法时间的下界在比较排序算法中,用比较操作来确定输入序列《a1,a2,……,an》的元素间次序。决策树是一棵完全二叉树,比较排序可以被抽象视为决策树。在决策树中,节点表示为i:j,

2015-11-30 20:00:22 766

原创 MIT算法导论-第四讲-快速排序

1.快速排序的描述快速排序算法采用的分治算法,因此对一个子数组A[p…r]进行快速排序的三个步骤为:(1)分解:数组A[p…r]被划分为两个(可能为空)子数组A[p…q-1]和A[q+1…r],给定一个枢轴,使得A[p…q-1]中的每个元素小于等于A[q],A[q+1…r]中的每个元素大于等于A[q],q下标是在划分过程中计算得出的。(2)解决:通过递归调用快速排序,对子数组A[p…q-1]和A[q

2015-11-28 16:38:03 2068 1

原创 MIT算法导论-第三讲-分治

分治法思想(1)Divide,把问题分解成子问题。(2)Conquer,递归地解决子问题。(3)Combine,合并子问题的解得到原问题的解。1.归并排序Step1:Devide——将待排序的序列分成两个子序列Step2:Conquer——(递归地)对每个子序列进行排序Step3:Combine——将排序好的子序列合并T(n)=2*T(n/2)+O(n)=Θ(nlogn)//合并已有序的a[p,..

2015-11-27 19:51:24 601

原创 MIT算法导论-第二讲-渐进符号,递归及解法

1.渐进符号Θ符号,f(n) = Θ(g(n)),表示f(n)的复杂度既大于等于g(n)的复杂度,又小于等于g(n)的复杂度,即于g(n)的复杂度相当。O符号,f(n) = O(g(n)),表示f(n)的复杂度最多与g(n)一个数量级,即小于等于。Ω符号,f(n) = Ω(g(n)),f(n)的复杂度最少与g(n)一个数量级,即大于等于。 o符号,f(n) = o(g(n)),表示f(n)的复

2015-11-26 21:14:46 2022

原创 MIT算法导论-第一讲-算法分析

1.算法的定义算法就是定义良好的计算过程,它取一个或一组值做为输入,并产生一个或一组值做为输出。算法就是一系列的计算步骤,用来将输入数据转换成输出结果。 已排序为例 - 输入:由n个数构成的一个序列《a1,a2,…,an》 - 输出:对输入序列的一个排列(重排)《A1,A2,…,An》2.算法的运行时间对于运行时间,需要考虑的因素有如下三个:a、数据的输入情况。例如,对于插入排序算法来说,

2015-11-25 20:53:17 1908

原创 MIT算法导论-第11讲-动态规划

动态规划与分治方法相似,都是通过组合子问题的解来求解原问题。 分治法将问题划分为互不相交的子问题,递归地求解子问题,再将它们的解组合起来,求出原问题的解。与之相反,动态规划应用于子问题重叠的情况,即不同的子问题具有公共的子子问题(子问题的求解是递归进行的,将其划分为更小的子子问题)。在这种情况下,分治算法会做许多不必要的工作,它会反复地求解那些公共子子问题。而动态规划算法对每个子子问题只求解一次,

2015-11-24 21:27:17 519

原创 动态规划-钢铁切割

钢条切割问题Serling公司购买长钢条,将其切割为短钢条出售。切割工序本身没有成本支出。公司管理层希望知道最佳的切割方案。假定我们知道Serling公司出售一段长为i英寸的钢条的价格为pi(i=1,2,…,单位为美元)。钢条的长度均为整英寸。图15-1给出了一个价格表的样例。 钢条切割问题是这样的:给定一段长度为n英寸的钢条和一个价格表pi(i=1,2,…n),求切割钢条方案,使得销售收益r

2015-11-24 21:21:48 736

原创 动态规划-LIS

最长递增子序列(LIS)的问题是要找到一个给定序列的最长子序列的长度,使得子序列中的所有元素被排序的顺序增加。例如,{10,22,9,33,21,50,41,60,80} LIS的长度是6和 LIS为{10,22,33,50,60,80}。最优子结构:对于长度为N的数组A[N] = {a0, a1, a2, …, an-1},假设假设我们想求以aj结尾的最大递增子序列长度,设为L[j],那么L[j

2015-11-24 16:55:34 524

原创 剑指Offer-31-连续子数组的最大和

题目: 输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子树组。求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2,},因此输出为该子数组的和18 思路:动态规划 假设f(i)为以第i个数字结尾的子数组的最大和,那么f(i)=A[i], f(i-1)<=0f(i)

2015-11-24 15:59:05 251

原创 剑指Offer-30-最小的k个数-最大堆

先创建一个大小为K的数据容器来存储最小的K个数,接下来我们每次从输入的n个整数中读入一个数,如果容器中已有的数字少于K,则直接把这次读入的整数放入容器中;如果容器中已有K个数,就是容器满了,此时我们不能插入新的数字而只能替换已有的数字了。找出这K个数的最大值,然后拿这次待插入的整数和最大值相比较。如果待插入的值比当前已有的最大值小,则用这个数替换当前已有的最大值;如果待插入的值比当前已有的最大值还大

2015-11-24 14:58:25 473

原创 剑指Offer-30-最小的k个数

题目: 输入n个整数,找出其中最小的k个数。例如输入4,5,1,6,2,7,3,8,则最小的4个数字是4,1,2,3. 思路1:使用Partition函数的O(n)算法 可以基于Partition函数来解决这个问题。如果基于数组的第k个数字来调整,使得比第k个数字小的所有数字都位于数组的左边,比第k个数字大的所有数字都位于数组的右边。这样调整之后,位于数组中左边的k个数字就是最小的k 个数字(

2015-11-24 14:16:40 275

原创 剑指Offer-29-数组出现次数超过一半的数字-基于Partition函数的O(n)算法

如果把这个数组排序,那么排序之后位于数组中间的数字一定就是出现次数超过数组长度一半的数字。也就是说,这个数字就是是统计学中的中位数。 在随机快速排序算法中,我们现在数组中随机选择一个数字,然后调整数组中数字的顺序,使得比选中数字小的数字都排在它的左边,比选中的数字大的数字都排在它的右边。如果这个选中的数字的下标正好是n/2(中位数),那么这个数字就是待定的出现次数超过一半的数字的候选(因为有一种可

2015-11-24 13:44:39 723

原创 快速排序

1、算法思想  快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。(1) 分治法的基本思想  分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。(2)快速排序的基本思想  设当

2015-11-24 13:21:25 243

原创 八皇后问题

#include <iostream>using namespace std;//皇后数量int num = 0;//皇后的在棋盘中的位置//数组下标代表皇后所位于棋盘的行//所在下标对应数组中的值代表皇后所位于棋盘的列int x[100];//排列解的个数int sum = 0;//判断皇后所在位置是否合法//与前面已排好位置的皇后进行条件检验bool place(int t) {

2015-11-23 17:31:58 182

原创 剑指Offer-29-查找数组中出现次数超过一般的元素

思路: 数组中有一个数字出现的次数超过数组长度的一半,也就是说它出现的次数比其他所有数字出现次数的和还要多。因此我们可以考虑在遍历数组的时候保存两个值: 一个是数组中的一个数字, 一个是次数。当我们遍历到下~个数字的时候,如果下一个数字和我们之前保存的数字相同,则次数加l :如果下一个数字和我们之前保存的数字,不同,则次数减1 。如果次数为霉,我们需要保存下一个数字,并把次数设为1 。由于我们要找

2015-11-22 16:42:16 420

原创 剑指Offer-28-字符串排列

#include <iostream>using namespace std;void print(char* str, int length);void permutation(char* str, int begin, int length);void permutation(char* str, int length) { if (str == NULL || length <=

2015-11-22 16:02:55 242

原创 剑指Offer-27-二叉排序树转双向链表

#include <iostream>using namespace std;struct BinaryTreeNode { int m_nValue; struct BinaryTreeNode* m_pLeft; struct BinaryTreeNode* m_pRight;};BinaryTreeNode* convert(BinaryTreeNode *pRoo

2015-11-22 15:36:45 322

原创 剑指Offer-26-复杂链表的复制-优化

前面文章所使用的方法时间主要花费在定位结点的m_pSibling上面,我们试着在这方面去做优化。 我们还是分为两步: 第一步仍然是复制原始链表上的每个结点N,并创建N’,然后把这些创建出来的结点链接起来。这一次,我们把新创建的每个结点N’链接在原先结点N的后面。 代码如下:void CloneNodes(ComplexListNode *pHead) { ComplexListN

2015-11-21 11:58:28 311

原创 剑指Offer-26-复杂链表的复制

题目: 有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。其结点的C++定义如下: struct ComplexNode { int m_nValue; ComplexNode* m_pNext; ComplexNode* m_pSibling; }; 请完成函数Comple

2015-11-21 11:27:01 354

原创 剑指Offer-25-二叉树中和为某一值的路径

题目: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始一直到叶结点所经过的结点形成一条路径。 思路: 使用辅助栈保存目前遍历所得路径,使用前序遍历的方式遍历二叉树。 1.如果目前路径所有结点值的和等于期望值,并且该结点为叶节点,打印该辅助栈保存的路径。 2.如果目前路径所有结点值的和小于期望值,递归调用函数,传入该结点的子结点。 3.如果目前路径

2015-11-16 11:19:52 298

原创 剑指Offer-24-二叉搜索树的后序遍历序列

题目: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。假设输入数组的任意两个数字都不相同。 思路: 二叉树的后序遍历为左右中,同时,二叉搜索树的特点为左子树的所有结点均小于根结点,右子树的所有结点均大于根结点。 因此从输入数组的最后一个元素对二叉树后序遍历结果进行切分,切分结果必须保证左子树的所有结点均小于根结点,右子树的所有结点均大于根结点,否则该树不是二叉搜索树。#in

2015-11-16 10:20:33 288

原创 剑指Offer-23-从上往下打印二叉树

题目: 从上往下打印二叉树的每个结点,同一层的结点按照从左到右的顺序打印。 思路: 实际该题即为二叉树的层次遍历,可以使用一个辅助队列,打印完某结点后将其左结点和右结点依次加入队列,循环遍历队列,直至队列为空。#include <iostream>#include <queue>using namespace std;struct BinaryTreeNode { int m_nV

2015-11-16 09:44:27 273

原创 剑指Offer-22-栈的压入、弹出序列

题目: 判断一数字序列是否为这些数字入栈的一种出栈方式(前提:栈中的数字不重复),比如,栈的序列为:1 2 3 4 5,那么4 5 3 2 1为一种弹出序列, 4 3 5 1 2不是。 思路: 开辟一个辅助栈,模拟入栈出栈过程(假设pPush为入栈序列,pPop为出战序列)。 1.辅助栈为空或辅助栈栈顶元素与出栈序列指向元素不同,pPush中的元素依次压入辅助栈,直至新压入的元素与辅助栈栈顶

2015-11-15 19:58:37 252

原创 剑指Offer-21-包含min函数的栈

题目: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数,在该栈中,调用min,push,pop的时间复杂度都为O(1)。 思路: 模拟栈push,pop过程#include <iostream>#include <stack>using namespace std;template <typename T> class MinStack{public:

2015-11-15 19:42:11 253

原创 剑指Offer-20-顺时针打印矩阵

题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每个数字。比如1 2 3 4 5 6 7 89 10 11 1213 14 15 16打印结果为 1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10思路: 顺时针打印实际上是每次循环打印一圈矩阵的外层,然后圆圈不断向内缩小,每次打印的起始点实际为(i,i)i=0,1,2,…。

2015-11-14 12:13:28 231

原创 剑指Offer-19-二叉树的镜像

题目: 完成一个函数,输入一个二叉树,该函数输入二叉树的镜像。原二叉树 8 1 23 4则输出 8 2 1 3 4思路: 前序遍历二叉树的每个结点,如果遍历到的结点有子结点,就交换它的两个左右子节点,当交换完所有非叶子结点的左右子结点之后,就得到了二叉树的镜像。#include <

2015-11-14 11:49:37 320

原创 剑指Offer-18-树的子结构

题目: 输入两棵二叉树A,B,判断B是不是A的子树。 思路 1.遍历二叉树A,查找与二叉树B根节点值相同的结点R,若存在,进行第二步比较。 2.判断树A中以R为根节点的子树是不是和树B具有相同的结构,使用递归的思路:如果结点R的值和树B的根节点值不相同,则以R为根结点的子树和树B肯定结构不同;如果它们的值相同,那么递归判断它们各自的左右结点是不是相同。 递归的终止条件是到达树A或树B的叶结

2015-11-14 11:41:29 283

原创 剑指Offer-17-合并有序链表

题目: 已知两个分别递增有序的单向链表,将两个有序链表合并为一个有序递增的单向链表。 思路: (1)使用递归的方式 1.使用两个指针pa,pb分别指向两个有序的链表a,b的头结点。 2.如果pa为空返回pb,如果pb为空,返回pa。 3.如果pa,pb均不为空 如果pa->value <= pb->value,使指针head指向pa,并递归pa->next与pb; 4.如果pa->v

2015-11-13 22:06:11 313

原创 剑指Offer-16-翻转链表

题目: 定义一个函数,输入一个链表的头结点,翻转该链表并输出翻转后的链表。 思路: 1.使用两个指针a,b分别指向待翻转的两个结点,同时为了防止断链,使用一个指针c保存b->next指针,c=b->next。 2.连个结点翻转后,a=b,b=c。 3.循环1,2直至b为NULL。 注意: 1.第一个结点的next指针赋NULL 2.链表为空的情况 3.链表只有一个结点的情况#in

2015-11-13 19:13:58 329

原创 剑指Offer-15-链表中的倒数第k个节点

题目:输入一个链表,查找该链表中的倒数第k个结点 比如链表为{1,2,3,4},则倒数第2个节点为3。 思路: 使用两个指针,第1个指针先走k-1步,然后,两个指针同时前进,知道第一个指针走到链表末尾。 注意:该题应当注意如果k超过链表长度的情况,增加代码鲁棒性。#include <iostream>using namespace std;struct ListNode { int

2015-11-12 21:06:16 251

原创 剑指Offer-14-调整数组顺序使奇数位于偶数之前

题目:输入一个整数数组,实现一个函数来调整该数组中的数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。 思路: 1、两个指针,1个指向数组前过滤奇数,1个指向数组末尾过滤偶数 2、前向指针不断后移,直至指向偶数或越界 3、后向指针不断迁移,直至指向奇数或越界#include <iostream>using namespace std;void ReorderOddEv

2015-11-11 20:33:46 249

原创 剑指Offer-13-在O(1)时间删除链表结点

题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。链表结点与函数的定义如下:#include <iostream>using namespace std;struct ListNode { int value; ListNode *pNext;};/** *判断结点是否属于某链表,属于返回true,不属于返回false */bool isE

2015-11-11 16:55:29 331

原创 大数相加

竖式计算 1.比较2个数组长度,结果取较长的+1 2.对齐竖式所加位,结果放入结果数组 3.对结果数组进行进位操作package char3;public class BigIntAdd { char[] add(char[] a,char[] b){ if(a.length<=0 || b.length<=0) return null;

2015-11-09 21:54:22 304

原创 剑指Offer-12-打印1到最大的n位数

package char3;public class Print1ToMaxOfNDigits { //采用字符串模拟加法 void Print1ToMaxOfNDigits(int n) { if(n<=0) return; char number[] = new char[n]; for(int i = 0;i

2015-11-09 20:56:07 276

原创 剑指Offer-11-数值的整数次方

package char3;/** * 数值的整数次方 * */public class Power { boolean g_InvalidInput = false; double power(double base,int exponent) { if(exponent < 0 && equal(base,0.0)) { g_Inv

2015-11-09 20:55:08 278

原创 剑指Offer-10-二进制中1的个数

package char2;public class NumberOfOne { /* 统计二进制中1的个数 */ int f1_NumberOfOne(int number) { int count = 0; while(number != 0) { if((number & 1) == 1) co

2015-11-09 20:53:51 288

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除