经典算法
阳光的颜色
我喜欢程序员,他们单纯固执,容易体会到成就感。面对压力,能够挑灯夜战不眠不休。面对困难,能够迎难而上挑战自我。他们也会感到困惑与傍徨,但每个程序员的心中都有一个比尔盖茨或是乔布斯的梦想,用智慧开创属于自己的事业。我想说的是,其实我是一个程序员
展开
-
最大子数组问题
#include#includeusing namespace std;struct max_sit_subarray{int low;int sum;int high;};//求跨越中点的最大子数组max_sit_subarray find_max_crossing_subarray(int A[],int low,int mid,int hi原创 2013-10-05 20:34:41 · 638 阅读 · 0 评论 -
C++指针数组、数组指针、数组名及二维数组技巧汇总
这篇文章主要介绍了C++指针数组、数组指针、数组名及二维数组技巧汇总,对于深入理解C++数组与指针来说非常重要,需要的朋友可以参考下。本文较为详细的分析了关于理解C++指针数组,数组指针,数组名,二维数组的一些技巧。是比较重要的概念,相信对于大家的C++程序设计有一定的帮助作用。原创 2015-06-18 16:20:46 · 1069 阅读 · 0 评论 -
位运算实现乘法运算
在回答本问题之前,先学习一些有关位运算的知识。(1) 常用的等式: -n=~(n-1)=~n+1(2) 获取整数n的二进制中最后一个1: n&~(n-1)或者n&(-n)。例如n=010100,则-n=101100,n&(-n)=000100。(3) 去掉整数n的二进制中最后一个1: n&(n-1)。例如n=010100,n-1=010011,则n&(n-1)=010000。注:对原创 2015-06-18 12:18:14 · 14351 阅读 · 0 评论 -
给定一个二叉树,获取该二叉树的宽度深度
给定一个二叉树,获取该二叉树的宽度深度。原创 2015-07-06 16:23:00 · 2154 阅读 · 0 评论 -
栈的压入、弹出序列
解题分析:如果下一个弹出的数字刚好是栈顶数字,那么直接弹出。如果下一个弹出的数字不在栈顶,我们把压栈序列中还没有入栈的数字压入辅助栈,直到把下一个需要弹出的数字压入栈顶为止。如果所有的数字都压入了栈了仍然没有找到下一个弹出的数字,那么该序列不可能是一个弹出序列原创 2015-08-25 17:58:33 · 907 阅读 · 0 评论 -
剑指offer26:复杂链表的复制
复杂链表的复制第三步,我自己写了一个函数,易于理解。把第二步得到的链表拆分成两个链表,奇数位置上的结点组成原始链表,偶数位置上的结点组成复制出来的链表。原创 2015-08-26 17:55:26 · 1077 阅读 · 0 评论 -
八皇后问题(C语言版本)
八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。原创 2015-07-05 15:10:31 · 40316 阅读 · 15 评论 -
全排列问题
字符串全排列算法 设R={r1,r2,...,rn}是要进行排列的n个元素,Ri=R-{ri}ri+Perm(X)表示在全排列Perm(X)的每一个排列前加上前缀ri得到的排列。(1)当n=1时,Perm(R)=(r),其中r是集合R中唯一的元素。(2)当n>1时,Perm(R)可由(r1)+Perm(R1),(r2)+Perm(R2),...,(rn)+Perm(Rn)构成。原创 2015-04-21 20:17:51 · 1057 阅读 · 0 评论 -
求链表的倒数第K个结点
题目 输入一个单向链表,输出该链表中倒数第 k 个结点。链表的倒数第 0 个结点为链表的尾指针。思路 解法一: 可以先遍历一遍统计链表个数,然后找到倒数第k个的下标再遍历,这样时间复杂度比较高 解法二: 双指针联动:一个指针先跑K -1步,然后两个指针一起跑。当第一个指针跑到尾节点时,第二个指针恰好是倒数第K个节点。需原创 2015-08-14 13:29:52 · 917 阅读 · 0 评论 -
atoi函数的详细实现(考虑溢出)
atoi()函数的功能:将字符串转换成整型数。atoi()会扫描参数str字符串,跳过前面的空白字符,直到遇上数字或正负号才开始做转换,而再遇到非数字或字符串时('\0')才结束转化,并将结果返回(返回转换后的整型数)。写atoi函数的时候需要注意一下几点1. 忽略字符串前的空白字符2. 字符串所表示数值的正负号3. 结束条件,遇到非数字或者字符'\0'结束4. 考虑溢原创 2015-08-14 11:37:03 · 7719 阅读 · 3 评论 -
统计重复字符串的个数
题目:统计重复字符串的个数,并输出。示例输入:abcdef示例输出:a1b1c1d1e1f1示例输入:abbbbbbbbbbbcc示例输出:a1b11c2原创 2015-09-01 10:46:31 · 6040 阅读 · 3 评论 -
分治法实现归并排序
程序调用自身的编程技巧称为递归( recursion)。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。原创 2013-09-29 11:27:07 · 2192 阅读 · 0 评论 -
双堆求中位数
双堆求中位数算法描述:1、创建两个堆(一个小根堆、一个大根堆),堆大小至少为给定数据个数的一半,向上取整;2、假定变量mid用来保存中位数,取定第一个元素,赋值给mid,即作为初始的中位数;3、依次遍历后面的每一个数据,如果比mid小,则插入大根堆;否则插入小根堆;4、如果大根堆和小根堆上的数据个数相差为2,则将mid插入到元素个数较少的堆中,然后从元素个数较多的堆中删除根节点,并将跟节点赋值给mid;5、重复步骤3和4,直到所有的数据遍历结束;此时,mid保存了一个数,再加上两原创 2015-03-31 10:40:06 · 3176 阅读 · 0 评论 -
堆的动态操作(插入、删除、调整)
堆有最大堆和最小堆之分,最大堆就是每个节点的值都>=其左右孩子(如果有的话)值的完全二叉树。最小堆便是每个节点的值都<=其左右孩子值的完全二叉树。原创 2015-03-31 10:44:50 · 5758 阅读 · 1 评论 -
Path Sum(LeetCode)
Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum.原创 2015-03-30 12:06:44 · 790 阅读 · 0 评论 -
数据结构与算法分析-C语言描述 重点笔记
第三章原创 2014-10-10 16:11:08 · 2227 阅读 · 0 评论 -
组合数学--错排问题
错排问题,在IT面试笔试中都经常原创 2014-10-11 15:53:12 · 7164 阅读 · 0 评论 -
关于求余数的思考
1.首先参考公式:m%n=(商)*n+余数(m,n是整数)原创 2014-10-29 10:21:06 · 1146 阅读 · 1 评论 -
链表的逆序问题
void ReverstList3(Node3 **head){if(head==NULL||*head==NULL)return;Node3 *p=(*head)->next,*q=NULL; //p指向当前逆转的结点,q指向下一个结点(*head)->next=NULL; //新的空的逆序链表while(p){q=p->next; p->next=(*head)-原创 2014-10-13 23:21:11 · 716 阅读 · 0 评论 -
剑指offer 面试题25 求二叉树中和为某一路径的值
//后续遍历树void PostfixTraverse(BiTree T){ if(T!=NULL){ PostfixTraverse(T->left); PostfixTraverse(T->right); std::coutkey<<" "; }}//前序创建树,输入完后程序运行结束,不需要输入crtl+z结束void CreateBiTreePrefix(BiTre原创 2014-10-14 12:51:10 · 677 阅读 · 0 评论 -
求两个字符串的最长的连续公共子串和求两个字符串的公共子序列
这与求两个字符串的公共子序列要区分开,见http://blog.csdn.net/shandianling/article/details/7888050但 求你方法与求公共子序列类似,而且要简单一点。方法:动态规划.循环遍历两个字符串,查找当s1[i]==s2[k] 的情况 然后保存在c[i][k]中,c[i][k]=c[i-1][k-1]+1 最后我们会得到类似以下矩阵原创 2014-11-08 11:33:37 · 1188 阅读 · 0 评论 -
求解集合的交集问题
思路1:排序法 对集合A和集合B进行排序(升序,用快排,平均复杂度O(N*logN)),设置两个指针p和q,同时指向集合A和集合B的最小值,不相等的话移动*p和*q中较小值的指针,相等的话同时移动指针p和q,并且记下相等的数字,为交集的元素之一,依次操作,直到其中一个集合没有元素可比较为止。 优点:操作简单,容易实现。 缺点:使用的排序算法不当,会耗费大量的时间,比如原创 2014-10-12 19:10:06 · 3070 阅读 · 0 评论 -
N-gram统计语言模型(总结)
自然语言从它产生开始,逐渐演变成一种上下文相关的信息表达和传递的方式,因此让计算机处理自然语言,一个基本的问题就是为自然语言这种上下文相关特性建立数学模型。这个数学模型就是自然语言处理中常说的统计语言模型,它是今天所有自然语言处理的基础,并且广泛应用与机器翻译、语音识别、印刷体和手写体识别、拼写纠错、汉字输入和文献查询。原创 2014-11-18 19:49:30 · 19999 阅读 · 2 评论 -
二叉树的相关操作代码(继续补全中)
#ifndef BITREEOPERATION_H#define BITREEOPERATION_H#include#include#include#includetypedef char ElemType;typedef struct BiNode{ ElemType data; struct BiNode *lchild,*rchild;}BiNode,*BiTree;原创 2015-03-27 15:17:50 · 851 阅读 · 0 评论 -
Symmetric Tree[LeetCode]对称二叉树
https://leetcode.com/problems/symmetric-tree/题目:Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).For example, this binary tree is symmetric:原创 2015-03-27 15:10:19 · 1099 阅读 · 0 评论 -
外排序
外排序外排序(External sorting)是指能够处理极大量数据的排序算法。通常来说,外排序处理的数据不能一次装入内存,只能放在读写较慢的外存储器(通常是硬盘)上。外排序通常采用的是一种“排序-归并”的策略。在排序阶段,先读入能放在内存中的数据量,将其排序输出到一个临时文件,依此进行,将待排序数据组织为多个有序的临时文件。尔后在归并阶段将这些临时文件组合为一个大的有序文件,也即排序结果。原创 2015-03-30 22:50:24 · 866 阅读 · 0 评论 -
大数加减法
大数加法char* MaxAdd(char *str1,char *str2){ int len1=strlen(str1); int len2=strlen(str2); int num1[MAX]={0}; int num2[MAX]={0}; for(int j=0,i=len1-1;i>=0;i--,j++){ num1[j]=str1[i]-'0'; //转换为int数原创 2015-04-15 11:29:11 · 1716 阅读 · 1 评论