12 2012 档案
[leetcode]Gray Code
摘要:The gray code is a binary numeral system where two successive values differ in only one bit. Given a non-negative integer n representing the total number of bits in the code, print the sequence of gray code. A gray code sequence must begin with 0. For example, given n = 2, return [0,1,3,2]. Its gray 阅读全文
posted @ 2012-12-31 11:59 kkmm 阅读(4774) 评论(0) 推荐(0) 编辑
[leetcode]Flatten Binary Tree to Linked List
摘要:class Solution {public: //目的是将binary tree变成前序遍历的list,但是变换过程是后序遍历 void flatten(TreeNode *root, TreeNode *&first, TreeNode *&last){ if (!root) return ; TreeNode *leftFirst = NULL; TreeNode *leftLast = NULL; TreeNode *rightFirst = NULL; TreeNode *righ... 阅读全文
posted @ 2012-12-31 11:32 kkmm 阅读(594) 评论(0) 推荐(0) 编辑
[leetcode]Generate Parentheses
摘要:class Solution {public: //p是当前的string( 例如"((()" );k是当前长度,例如4;n是总长度;lMore是左括号比右括号多多少 void generateParenthesis(string p, int k, int n, int lMore){ if (lMore < 0) return; if (k == n){ if (lMore == 0) result.push_back(p); //如果满足条件,push_back并退出 ... 阅读全文
posted @ 2012-12-31 11:32 kkmm 阅读(538) 评论(0) 推荐(0) 编辑
[leetcode]Edit Distance
摘要:先给一个例子,两个字符串eeba和abca相似度是多少呢,edit distance是一个很好的度量,定义从字符串a变到字符串b,所需要的最少的操作步骤(插入,删除,更改)为两个字符串之间的编辑距离。对于eeba,abca它们之间的编辑距离为3,可以按照上面的操作步骤(不是唯一的)将eeba变到abca,1.将e变为a 2.删除e 3.添加c 共3个步骤。典型的动态规划问题。EDIT[i,j]表示对于字符串a从1到i的子串和字符串b从1到j的字串的编辑距离。(字符串下标从1开始)EDIT[i - 1,j] + 1表示对a 在i 位置删除delete操作EDIT[i,j - 1] + 1 表示i 阅读全文
posted @ 2012-12-31 00:04 kkmm 阅读(9570) 评论(0) 推荐(2) 编辑
[leetcode]Divide Two Integers
摘要:直接用除数去一个一个加,直到被除数被超过的话,会超时。解决办法每次将被除数增加1倍,同时将count也增加一倍,如果超过了被除数,那么用被除数减去当前和再继续本操作。#include <iostream>#include <vector>#include <string>using namespace std;class Solution {public: int divide(int dividend, int divisor) { // Start typing your C/C++ solution below // DO NOT write int 阅读全文
posted @ 2012-12-30 22:49 kkmm 阅读(5460) 评论(1) 推荐(0) 编辑
[leetcode]Decode Ways
摘要:/*每次对于当前的字符判断是否属于1-9(0肯定不行,因为0不在1-26中),如果属于,那么当前的字符可以被decode,并且和f[n-1]组合,f[n] += f[n-1]然后对于当前字符和前一个字符组成的字符串判断是否属于10-26,如果属于,那么这两个字符可以被decode,并且和f[n-2]组合,f[n] += f[n-2]*/#include <iostream>#include <vector>#include <string>using namespace std;class Solution {public: int numDecodings 阅读全文
posted @ 2012-12-30 20:54 kkmm 阅读(2123) 评论(0) 推荐(0) 编辑
[leetcode]count and say2
摘要:class Solution {public: //when see str, return count and say of str string process(const string& str){ if (str == "") return ""; int l = 0; int r = 0; int count = 0; string result = ""; for (; r < str.length(); ){ if (str[r] == st... 阅读全文
posted @ 2012-12-30 20:37 kkmm 阅读(233) 评论(0) 推荐(0) 编辑
[leetcode]Convert Sorted Array to Binary Search Tree
摘要:直来直去的题目,注意用 l和 r 两个下标来指示左右范围,并且用 if ( l > r ) 来作为递归出口,相比于用 start 和 len 来指示范围更优雅且不易出错。class Solution {public: TreeNode *sortedArrayToBST(vector<int> &num, int l, int r){ if (num.size() < 1 || l < 0 || r > num.size()-1 || l > r) return NULL; int mid = (l+r)/2; TreeNo... 阅读全文
posted @ 2012-12-30 17:27 kkmm 阅读(192) 评论(0) 推荐(0) 编辑
[leetcode]Container With Most Water
摘要:#include <iostream>#include <vector>using namespace std;class Solution {public: int maxArea(vector<int> &height) { // Start typing your C/C++ solution below // DO NOT write int main() function if (height.size() < 2) return 0; int l = 0; int r = height... 阅读全文
posted @ 2012-12-30 17:17 kkmm 阅读(283) 评论(0) 推荐(0) 编辑
[leetcode]Construct Binary Tree from Preorder and Inorder Traversal
摘要:struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {}};class Solution {public: TreeNode *buildTree(vector<int> &pre, int preStart, vector<int> &in, int inStart, int len){ if (preStart<0 || preStart+len>pre.size() || 阅读全文
posted @ 2012-12-30 16:55 kkmm 阅读(245) 评论(0) 推荐(0) 编辑
[leetcode]Construct Binary Tree from Inorder and Postorder Traversal
摘要:struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {}};class Solution {public: TreeNode *buildTree(vector<int> &in, int inStart, vector<int> &post, int postStart, int len){ if (inStart<0 || inStart+len>in.size() || 阅读全文
posted @ 2012-12-30 16:50 kkmm 阅读(192) 评论(0) 推荐(0) 编辑
反转链表(不改变节点指针方向)
摘要:#include <iostream>#include <stack>using namespace std;struct Node{ int data; Node *next; Node(int d) : data(d) {}};int label = 0;//思路:设两个指针,left和right,首先将right走到头,交换left和right,然后每return一次,right自动向左一次,left手动向右走一次。void Reverse(Node *&left, Node *right){ if (!left || !right) return;... 阅读全文
posted @ 2012-12-30 16:29 kkmm 阅读(501) 评论(0) 推荐(0) 编辑
[leetcode]Combination Sum
摘要:使用深度优先搜索解决。#include <iostream>#include <string>#include <vector>using namespace std;class Solution {public: vector<vector<int> > combinationSum(vector<int> &candidates, int target) { vector<int> tmpresult; tmpresult.clear(); combinationSumCore(candidates 阅读全文
posted @ 2012-12-21 16:49 kkmm 阅读(265) 评论(0) 推荐(0) 编辑
二叉树删除节点
摘要:#include <iostream>#include <string>using namespace std;struct TreeNode{ int data; TreeNode *lchild; TreeNode *rchild;};TreeNode *findMin(TreeNode *&root){ while (root->lchild) root = root->lchild; return root;}void DeleteNode(TreeNode *root, int x){ if (!root) return... 阅读全文
posted @ 2012-12-19 22:53 kkmm 阅读(352) 评论(0) 推荐(0) 编辑
[leetcode]Best Time to Buy and Sell Stock III
摘要:#include <iostream>#include <vector>using namespace std;class Solution {public:/*解释:首先,因为能买2次(第一次的卖可以和第二次的买在同一时间),但第二次的买不能在第一次的卖左边。所以维护2个表,f1和f2,size都和prices一样大。意义:f1[i]表示 -- 截止到i下标为止,左边所做交易能够达到最大profit;f2[i]表示 -- 截止到i下标为止,右边所做交易能够达到最大profit;那么,对于f1 + f2,寻求最大即可。*/ int maxProfit(vector< 阅读全文
posted @ 2012-12-19 21:13 kkmm 阅读(4701) 评论(0) 推荐(0) 编辑
[leetcode]Best Time to Buy and Sell Stock II
摘要:#include <iostream>#include <vector>using namespace std;//总体思路,每当有一个上升趋势,就要抓住它//那么维护2个迭代器,left和right,left指向阶段性最低(靠左),right指向阶段性最高(靠右)//需要注意的是迭代器在使用的过程中不要超出了范围,例如下面注释部分特别需要注意class Solution {public: int maxProfit(vector<int> &prices) { vector<int>::const_iterator left = pri 阅读全文
posted @ 2012-12-19 21:11 kkmm 阅读(269) 评论(0) 推荐(0) 编辑
[leetcode]Best Time to Buy and Sell Stock
摘要:#include <iostream>#include <vector>#include <stack>using namespace std;//简单的DP算法class Solution {public: int maxProfit(vector<int> &prices) { // Start typing your C/C++ solution below // DO NOT write int main() function int size = prices.size(); if (!size) r... 阅读全文
posted @ 2012-12-19 21:10 kkmm 阅读(171) 评论(0) 推荐(0) 编辑
[leetcode]Binary Tree Level Order Traversal II
摘要:#include <iostream>#include <vector>#include <stack>#include <queue>using namespace std;struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {}};class Solution {public: vector<vector<int> > levelOrderBottom( 阅读全文
posted @ 2012-12-19 00:00 kkmm 阅读(198) 评论(0) 推荐(0) 编辑
[leetcode]Binary Tree Level Order Traversal
摘要:#include <iostream>#include <vector>#include <stack>#include <queue>using namespace std;struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {}};class Solution {public: vector<vector<int> > levelOrder(TreeNo 阅读全文
posted @ 2012-12-18 23:59 kkmm 阅读(234) 评论(0) 推荐(0) 编辑
[leetcode]Binary Tree Maximum Path Sum
摘要:#include <iostream>#include <vector>#include <stack>#include <queue>using namespace std;struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {}};/*本题心得:0 如何分析一个问题1 没有固定格式的判断方式2 越界*/class Solution {public: int maxPathSum 阅读全文
posted @ 2012-12-18 23:48 kkmm 阅读(870) 评论(0) 推荐(0) 编辑
[leetcode]count and say
摘要:#include <iostream>#include <vector>#include <stack>#include <queue>using namespace std;class Solution {public: string countAndSay(int n) {//调用process N次 if (n<1) return ""; string str = "1"; if (n == 1) return str; for (int i = 1; i < n; i++){ ... 阅读全文
posted @ 2012-12-18 23:47 kkmm 阅读(1103) 评论(0) 推荐(0) 编辑
Quick Sort
摘要:#include <iostream>using namespace std;void QuickSortCore(int a[], int start, int end){ if (start > end) return; int key = a[start]; int blank = start; int left = start + 1; int right = end; while(left <= right){//维护left right blank key if (blank < left){ i... 阅读全文
posted @ 2012-12-18 23:46 kkmm 阅读(187) 评论(0) 推荐(0) 编辑
判断二叉树是否平衡(Bottom-up)
摘要:#include <iostream>#include <vector>using namespace std;struct BTreeNode{ int value; BTreeNode *lchild; BTreeNode *rchild;};bool IsBalanced(BTreeNode *pRoot, int &height){ if (!pRoot){ height = 0; return true; } int leftHeight = 0; int rightHeight = 0; bool left... 阅读全文
posted @ 2012-12-17 14:11 kkmm 阅读(350) 评论(0) 推荐(0) 编辑
[转]了解如何通过reverse_iterator的base得到iterator
摘要:转自:http://blog.csdn.net/shuchao/article/details/3705252调用reverse_iterator的base成员函数可以产生“对应的”iterator,但这句话有些辞不达意。举个例子,看一下这段代码,我们首先把从数字1-5放进一个vector中,然后产生一个指向3的reverse_iterator,并且通过reverse_iterator的base初始化一个iterator:vector<int> v;v.reserve(5); // 参见条款14for(int i = 1;i <= 5; ++ i) { // 向vector插 阅读全文
posted @ 2012-12-15 20:13 kkmm 阅读(2448) 评论(0) 推荐(0) 编辑
[转]反向迭代器(rbegin,rend)
摘要:转自:http://blog.csdn.net/kjing/article/details/6936325rbegin和rend,很有用!C++ primer (中文版第四版)第273页9.3.2 begin和end成员 begin和end操作产生指向容器内第一个元素和最后一个元素的下一个位置的迭代器,如下所示。这两个迭代器通常用于标记包含容器中所有元素的迭代范围。c.begin() 返回一个迭代器,它指向容器c的第一个元素c.end() 返回一个迭代器,它指向容器c的最后一个元素的下一个位置c.rbegin() 返回一个逆序迭代器,它指向容器c的最后一个元素c.rend() 返回一个逆序迭代 阅读全文
posted @ 2012-12-15 20:01 kkmm 阅读(4453) 评论(0) 推荐(1) 编辑
Crack Interview 9.1 合并排序数组
摘要:#include <iostream>#include <stack>#include <string>using namespace std;//merge a b两个排序过的数组,a的size是m,b的size是n,a具有足够大的空间存放merge后的元素们//思想是从后往前merge,因为后面都是没有存放数的空间,所以可以避免数组的平移void Merge(int a[], int b[], int m, int n){ int mWalker = m-1; int nWalker = n-1; for (int i = m+n-1 ; i > 阅读全文
posted @ 2012-12-14 16:29 kkmm 阅读(298) 评论(0) 推荐(0) 编辑
Crack Interview 3.3
摘要:Imagine a (literal) stack of plates If the stack gets too high, it might topple There-fore, in real life, we would likely start a new stack when the previous stack exceeds some threshold Implement a data structure SetOfStacks that mimics this SetOf-Stacks should be composed of several stacks, and sh 阅读全文
posted @ 2012-12-14 16:14 kkmm 阅读(719) 评论(0) 推荐(0) 编辑
字符串转整数
摘要:本方法借鉴自glibc,可以过滤如下情况:前缀空格非法输入正负号16进制8进制溢出1234L#include <iostream>using namespace std;#define LONG_MAX 2147483647L#define LONG_MIN -2147483648Llong StrToInt(const string &str){ unsigned long result = 0;//如果不用unsigned long,那么后面无法判断溢出(当发生溢出时,总是负数) int radix = 0; int sign = 1; string::const_.. 阅读全文
posted @ 2012-12-14 14:46 kkmm 阅读(253) 评论(0) 推荐(0) 编辑
通过bitmap的方式用8个int实现对256个char是否出现过做记录
摘要:程序设计中经常会出现这样的场景:遍历一个字符串a(例如:“A dog in on the floor.”),对于字符串b(例如“dnr”)中出现过的字符,统统删掉。那么对于b中出现的字符,通常可以保存在bool label[256]中来记录某个字符是否在字符串b中。但是还可以用一种更省内存的方式,就是bitmap。通过定义Set,ReSet和Get宏来快速定位某一个bit。并且使用sizeof(int)和动态数组来适应64位平台。#include <iostream>using namespace std;int intWidth = sizeof(int) * 8;int *la 阅读全文
posted @ 2012-12-13 14:34 kkmm 阅读(349) 评论(0) 推荐(0) 编辑
大端和小端(ZZ)
摘要:Byte Endian是指字节在内存中的组织,所以也称它为Byte Ordering,或Byte Order。对于数据中跨越多个字节的对象, 我们必须为它建立这样的约定:(1) 它的地址是多少?(2) 它的字节在内存中是如何组织的?针 对第一个问题,有这样的解释: 对于跨越多个字节的对象,一般它所占的字节都是连续的,它的地址等于它所占字节最低地址。(链表可能是个例外,但链表的地址可看作链表头的地址)。比如: int x, 它的地址为0x100。 那么它占据了内存中的0x100, 0x101, 0x102, 0x103这四个字节(32位系统,所以int占用4个字节)。上面只是内存字节组织的一种情 阅读全文
posted @ 2012-12-13 13:56 kkmm 阅读(479) 评论(0) 推荐(0) 编辑
C++类成员初始化顺序(用初始化列表)
摘要:从后往前初始化,例如下例中,首先初始化n1,因为用n2+2来初始化n1,所以n1的值为不确定;而n2稍后被初始化为0。#include <iostream>using namespace std;class A{private: int n1; int n2;public: A() : n2(0), n1(n2 + 2) {} void Print(){cout<<n1<<endl<<n2<<endl;}};int main(){ A a; a.Print(); return 0;}EOF 阅读全文
posted @ 2012-12-13 12:56 kkmm 阅读(574) 评论(0) 推荐(1) 编辑
将一个string左移N位置
摘要:使用了《编程珠玑》上的解法。#include <iostream>#include <string>using namespace std;//注意这里使用了XOR进行交换的方法,这种方法不能让一个数和自身交换void Reverse(string &str, int left, int right){ for(; left < right; left++, right--){ str[left] = str[left] ^ str[right]; str[right] = str[left] ^ str[right]; str[left] = ... 阅读全文
posted @ 2012-12-12 12:41 kkmm 阅读(370) 评论(0) 推荐(0) 编辑
求BST中第K大的元素
摘要:此题有2种变形:1、不能修改node结构,要求时间O(N).2、可以修改node结构,要求时间O(logN).这里对第一种变形作答。思路就是先看右子树中是否有符合条件的node,再看自己是不是符合,再看左子树中是否有符合条件的node。用递归的方法实现。用一个counter来表示当前访问到了第几大的节点。#include <iostream>using namespace std;//BST Nodestruct Node{ int data; Node *lchild; Node *rchild; void Init(int d, Node *l, Node *r){... 阅读全文
posted @ 2012-12-12 09:53 kkmm 阅读(505) 评论(0) 推荐(0) 编辑
牛顿求平方根法(输入是double,输出也是double)
摘要:#include <iostream>#include <string>using namespace std;//牛顿求平方根法double CustomizedSqrt(double n){ double r=1.0; while(abs(r*r-n)>1e-9) r=(r+n/r)/2; return r;}int main(){ int n = 200; double root = CustomizedSqrt(n); cout<<root<<endl; return 0;}EOF 阅读全文
posted @ 2012-12-12 07:18 kkmm 阅读(279) 评论(0) 推荐(0) 编辑
[转]vector和list区别
摘要:stl提供了三个最基本的容器:vector,list,deque。vector和built-in数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此它能非常好的支持随即存取,即[]操作符,但由于它的内存空间是连续的,所以在中间进行插入和删除会造成内存块的拷贝,另外,当该数组后的内存空间不够时,需要重新申请一块足够大的内存并进行内存的拷贝。这些都大大影响了vector的效率。list就是数据结构中的双向链表(根据sgi stl源代码),因此它的内存空间可以是不连续的,通过指针来进行数据的访问,这个特点使得它的随即存取变的非常没有效率,因此它没有提供[]操作符的重载。但由于链表的特点,它可. 阅读全文
posted @ 2012-12-11 22:30 kkmm 阅读(246) 评论(0) 推荐(0) 编辑
[转]float类型在内存中的表示
摘要:转自:http://blog.csdn.net/crystal_avast/article/details/7071590先说一下计算机中二进制的算法: 整数 整数的二进制算法大家应该很熟悉,就是不断的除以2取余数,然后将余数倒序排列。比如求9的二进制: 9/2=4 余 1 4/2=2 余 0 2/2=1 余 0 1/2=0 余 1 一直计算到商为0为止,然后将得到的余数由下到上排列,就得到了9的二进制:1001。 从上面的算法我们可以看到,用整数除以2,最终都能够到0。因此,整数是可以用二进制来精确表示的。小数 小数的二进制算法和整数的大致相反,就是不断的拿小数部分乘以2取积... 阅读全文
posted @ 2012-12-11 15:54 kkmm 阅读(1489) 评论(0) 推荐(0) 编辑
整数十进制转二进制
摘要:#include <iostream>#include <string>using namespace std;//整数十进制转二进制string DecimalToBinary(int dec){ string returnStr = ""; while (dec) { if (dec & 0x01 == 1){ returnStr.insert(0, "1"); dec >>= 1; } else{ returnStr.insert(0, "0"); ... 阅读全文
posted @ 2012-12-11 15:39 kkmm 阅读(201) 评论(0) 推荐(0) 编辑
[转]求二叉树中和为给定值的所有路径
摘要:问题定义: You are given a binary tree in which each node contains a value. Design an algorithm to print all paths which sum up to that value. Note that it can be any path in the tree-it does not have to start at the root.解题思路: 一层一层的遍历,保存当前节点到根节点的完整路径,然后从当前节点向上扫描,如果找到了当前节点到某个节点的和等于给定值,则输出之。程序对每个节点都需要遍历一遍 阅读全文
posted @ 2012-12-11 14:51 kkmm 阅读(244) 评论(0) 推荐(0) 编辑
反转链表
摘要:#include <iostream>#include <vector>#include <queue>using namespace std;struct LinkedListNode{ int value; LinkedListNode *pNext; LinkedListNode(int v) : value(v) {}};//创建链表LinkedListNode *CreateLinkedList(int arr[], int len){ LinkedListNode *pHead = new LinkedListNode(arr[0]); Link 阅读全文
posted @ 2012-12-10 16:35 kkmm 阅读(246) 评论(0) 推荐(0) 编辑
创建单链表
摘要:创建单链表的代码很简单,需要注意的一点是,一开始首先创建一个Node,然后让pPre指向它,并在之后的每次循环中用pCurr进行创建Node(pPre的意义是要将链表连起来)。#include <iostream>#include <vector>#include <queue>using namespace std;struct LinkedListNode{ int value; LinkedListNode *pNext; LinkedListNode(int v) : value(v) {}};LinkedListNode *CreateLinked 阅读全文
posted @ 2012-12-10 16:12 kkmm 阅读(249) 评论(0) 推荐(0) 编辑
将二叉树中每一层的节点串成链表
摘要:Crack interview 4.4思想很简单,层序遍历:#include <iostream>#include <vector>#include <queue>using namespace std;struct LinkedListNode{ int value; LinkedListNode *pNext;};struct BTreeNode{ int value; BTreeNode *pLeft; BTreeNode *pRight; BTreeNode(int v) { value = v; pLeft = N... 阅读全文
posted @ 2012-12-10 16:01 kkmm 阅读(426) 评论(0) 推荐(0) 编辑
对于一个排序数组,创建最低高度的Binary Tree
摘要:Cracking Interview 4-3:struct Node{ int value; Node *pLeft; Node *pRight;};Node *CreateBTree(int arr[], int begin, int end){ if (!arr || (begin > end)) return NULL; Node *pNode = new Node(); int mid = (begin + end)/2; pNode->value = arr[mid]; pNode->pLeft = CreateBTree... 阅读全文
posted @ 2012-12-09 14:01 kkmm 阅读(170) 评论(0) 推荐(0) 编辑
判断二叉树是否平衡
摘要:二叉树平衡的定义:从根到任意一个叶子节点的距离相差不超过1。#include <iostream>#include <stack>using namespace std;struct Node{ int value; Node *pLeft; Node *pRight;};int MaxDepth(Node *pRoot){ if (!pRoot) return 0; return (MaxDepth(pRoot->pLeft) > MaxDepth(pRoot->pRight)) ? (MaxDepth(pRoot->pLeft + 1)) : 阅读全文
posted @ 2012-12-09 13:10 kkmm 阅读(218) 评论(0) 推荐(0) 编辑
用2个stack模拟一个queue
摘要:#include <iostream>#include <stack>using namespace std;class MyQueue{public: void push(int value); void pop(); int front(); int back(); bool empty();private: stack<int> stackPush; stack<int> stackPop;};void MyQueue::push(int value){ stackPush.push(value);}void MyQueue::pop(){ 阅读全文
posted @ 2012-12-09 12:45 kkmm 阅读(718) 评论(0) 推荐(0) 编辑
stack排序
摘要:Cracking Interview 3-6用的书上的思路,O(n^2)的时间复杂度。#include <iostream>#include <stack>using namespace std;stack<int> sort(stack<int> unorderStack){ stack<int> orderStack; stack<int> tmpStack; while(!unorderStack.empty()) { int value = unorderStack.top(); if (orderStack.em 阅读全文
posted @ 2012-12-09 12:13 kkmm 阅读(715) 评论(0) 推荐(0) 编辑
设计一个具有min函数的stack
摘要:此题目来自于Crack the Coding Interview 3-23 2 How would you design a stack which, in addition to push and pop, also has a function min which returns the minimum element? Push, pop and in should all operate in O(1) time.思路是弄2个stack,一个realStack,存放真正的数据;另外一个是minStack,对于minStack元素中的每一个元素的意义是:push到该位置的时候,当前最小元 阅读全文
posted @ 2012-12-09 11:49 kkmm 阅读(1151) 评论(1) 推荐(1) 编辑
用一个数组实现三个stack
摘要:此题来自于Crack the Coding Interview,3.1题。要求:用1个数组实现3个stack,使得在数组没有满的情况之下,一直可以继续插入数,而且这3个stack的push和pop操作应该和普通stack用起来没有区别。此题的思路是,在这个数组中的每一个元素中加入一个指针域,在code中,这就是pPre,就是指向更先入栈的元素。这样,整个数组除了靠数组本身的index组织起来,在已经用过的元素中,还有3条链。此外,对于pop操作,如果该pop操作不是在数组有效元素的最末一个元素进行(这是可能的,例如stack 1占用位置124,stack 2占用位置356,那么stack 1进 阅读全文
posted @ 2012-12-09 11:18 kkmm 阅读(713) 评论(0) 推荐(0) 编辑
[转]C++指针加整数、两个指针相减的问题
摘要:转自:http://blog.csdn.net/onlyou930/article/details/6725051说来惭愧,写C++有一段时间了。这个问题从来没有认真考虑过,此次标记于此:考虑如下问题:1 char a[20];2 int *ptr = (int *)a;3 ptr++;第3句ptr++实际为ptr右移一个int空间(即4个字节)的距离,此时ptr指向a[4]。若第3句改为int *p = ptr + 2;则p指向a[8]这里说明当指针加整数时,指针向后偏移的距离看的是声明该指针的类型(此处即int),而非指向的实际类型(此处即char)!!!另外,如果我就是想在第3句处得到a 阅读全文
posted @ 2012-12-09 11:02 kkmm 阅读(723) 评论(0) 推荐(0) 编辑
My Solution to Longest Substring Without Repeating Characters
摘要:解法思想见原题:http://www.leetcode.com/2011/05/longest-substring-without-repeating-characters.html#include <iostream>#include <algorithm>#include <string>#include <vector>using namespace std;/* LeetCode: Longest Substring Without Repeating Charactersreturn value: length of longest s 阅读全文
posted @ 2012-12-08 23:17 kkmm 阅读(295) 评论(0) 推荐(0) 编辑
My Solution to A Distance Maximizing Problem
摘要:算法思想借鉴自:http://blog.csdn.net/clamreason/article/details/7904062由2个元素开始作为初始条件,一个一个元素的添加进现有数组,保存2个变量,1个是currMin,就是当前处理的子数组的最小元素,一个是maxDiff,就是当前处理的子数组中最大的数对之差。如果当前添加的元素比min小,更新min,如果当前添加的元素减去min比maxDiff大,那么更新maxDiff。/* LeetCode: A Distance Maximizing Problemreturn value: max differenceparameters: arr - 阅读全文
posted @ 2012-12-08 22:52 kkmm 阅读(570) 评论(0) 推荐(0) 编辑
My Solution to Lowest Common Ancestor of a Binary Tree Part II (Node has parent Pointer)
摘要:struct Node{ int value; Node *pLeft; Node *pRight; Node *pParent;};//BTree(not a BST)//both has parent pointerNode *LCA(Node *p, Node *q) //这里的p q为NULL的检测融入到了代码当中{ int pDepth = 0; int qDepth = 0; Node *walker = p; while (!walker) { walker = walker... 阅读全文
posted @ 2012-12-08 19:10 kkmm 阅读(197) 评论(0) 推荐(0) 编辑
My Solution to Lowest Common Ancestor of a Binary Tree(Down-Up Approach)
摘要://down-up approach for normal BTree(not a BST)//there's no parent pointerNode *LCA(Node *pRoot, Node *p, Node *q){ if (!pRoot) return NULL; if (pRoot == p || pRoot == q) return pRoot; Node *L = LCA(pRoot->pLeft, p, q); Node *R = LCA(pRoot->pRight, p, q); if (L && R) ... 阅读全文
posted @ 2012-12-08 17:51 kkmm 阅读(169) 评论(0) 推荐(0) 编辑
在链表中某个节点前面插入一个节点
摘要:在p后面插入新节点,将p的值与新建的节点值互换。 阅读全文
posted @ 2012-12-07 16:30 kkmm 阅读(589) 评论(0) 推荐(0) 编辑
[转]给定单链表,检测是否有环。如果有环,则求出进入环的第一个节点
摘要:转自:http://blog.csdn.net/dengsi23/article/details/7984291判断单向链表是否有环,可以采用快指针与慢指针的方式来解决。即定义一个快指针fast和一个慢指针slow,使得fast每次跳跃两个节点,slow每次跳跃一个节点。如果链表没有环的话,则slow与fast永远不会相遇(这里链表至少有两个节点);如果有环,则fast与slow将会在环中相遇。判断出链表有环以后,则需要算出进入环的第一个节点。在fast与slow第一次相遇后,设置一个节点pNode从链表的头部开始遍历,每次只遍历一个节点。这样,当fast与slow再次相遇时,pNode所处的 阅读全文
posted @ 2012-12-07 16:28 kkmm 阅读(1762) 评论(0) 推荐(0) 编辑
求二叉树叶子节点的个数
摘要:int LeavesNodeNum(Node *pRoot){ if (!pRoot) return 0; if (!pRoot->pLeft && !pRoot->pRight) return 1; return LeavesNodeNum(pRoot->pLeft) + LeavesNodeNum(pRoot->pRight);}EOF 阅读全文
posted @ 2012-12-07 16:10 kkmm 阅读(214) 评论(0) 推荐(0) 编辑
求二叉树第K层的节点数
摘要:int GetNodeNumKthLevel(Node *pRoot, int k){ if (!pRoot || k < 1) return 0; if (k = 1) return 1; return GetNodeNumKthLevel(pRoot->pLeft, k-1) + GetNodeNumKthLevel(pRoot->pRight, k-1);}EOF 阅读全文
posted @ 2012-12-07 16:04 kkmm 阅读(3145) 评论(0) 推荐(0) 编辑
二叉搜索树转双向链表
摘要:void BTreeToDoubleLinkList(Node *pRoot, Node *&pFirst, Node *&pLast){ if (!pRoot) { pFirst = NULL; pLast = NULL; return; } Node *pFirstLeft = NULL; Node *pLastLeft = NULL; Node *pFirstRight = NULL; Node *pLastRight = NULL; if (!pRoot->pLeft) pFirst... 阅读全文
posted @ 2012-12-07 15:35 kkmm 阅读(253) 评论(0) 推荐(0) 编辑
二叉树的层序遍历
摘要:void visit(Node *pRoot){ cout<<pRoot->value<<endl;}void LevelTraverse(Node *pRoot){ if (!pRoot) return; queue<Node *> q; q.push(pRoot); while (!q.empty()) { Node *pNode = q.front(); q.pop(); visit(pNode); if (pNode->pLeft) q.push(pNode-... 阅读全文
posted @ 2012-12-07 14:38 kkmm 阅读(214) 评论(0) 推荐(0) 编辑
二叉树的后序遍历
摘要:void visit(Node *pRoot){ cout<<pRoot->value<<endl;}void InOrderTraverse(Node *pRoot){ if (!pRoot) return; InOrderTraverse(pRoot->pLeft); visit(pRoot); InOrderTraverse(pRoot->pRight);}EOF 阅读全文
posted @ 2012-12-07 14:30 kkmm 阅读(144) 评论(0) 推荐(0) 编辑
二叉树的中序遍历
摘要:void visit(Node *pRoot){ cout<<pRoot->value<<endl;}void InOrderTraverse(Node *pRoot){ if (!pRoot) return; InOrderTraverse(pRoot->pLeft); visit(pRoot); InOrderTraverse(pRoot->pRight);}EOF 阅读全文
posted @ 2012-12-07 14:28 kkmm 阅读(161) 评论(0) 推荐(0) 编辑
二叉树的前序遍历
摘要:void visit(Node *pRoot){ cout<<pRoot->value<<endl;}void PreOrderTraverse(Node *pRoot){ if (!pRoot) return; visit(pRoot); PreOrderTraverse(pRoot->pLeft); PreOrderTraverse(pRoot->pRight);}EOF 阅读全文
posted @ 2012-12-07 14:27 kkmm 阅读(145) 评论(0) 推荐(0) 编辑
求二叉树深度
摘要:int Depth(Node *pRoot){ if (!pRoot) return 0; int leftDepth = Depth(pRoot->pLeft); int rightDepth = Depth(pRoot->pRight); return (leftDepth > rightDepth) ? (leftDepth + 1) : (rightDepth + 1);}EOF 阅读全文
posted @ 2012-12-07 14:23 kkmm 阅读(116) 评论(0) 推荐(0) 编辑
求二叉树节点总数
摘要:int GetNodeNum(Node *pRoot){ if (!pRoot) return 0; return GetNodeNum(pRoot->pLeft) + GetNodeNum(pRoot->pRight) + 1;}EOF 阅读全文
posted @ 2012-12-07 14:20 kkmm 阅读(299) 评论(0) 推荐(0) 编辑
轻松搞定面试中的二叉树题目
摘要:http://blog.csdn.net/walkinginthewind/article/details/7518888 阅读全文
posted @ 2012-12-07 14:14 kkmm 阅读(114) 评论(0) 推荐(0) 编辑
[转]拓扑排序
摘要:转自:http://blog.csdn.net/midgard/article/details/4101025#comments拓扑排序是对有向无环图的一种排序。表示了顶点按边的方向出现的先后顺序。如果有环,则无法表示两个顶点的先后顺序。在现实生活中,也会有不少应用例子,比如学校课程布置图,要先修完一些基础课,才可以继续修专业课。一个简单的求拓扑排序的算法:首先要找到任意入度为0的一个顶点,删除它及所有相邻的边,再找入度为0的顶点,以此类推,直到删除所有顶点。顶点的删除顺序即为拓扑排序。很容易得到拓扑排序的伪代码:void TopSort(Graph g){for (int i=0; i< 阅读全文
posted @ 2012-12-06 13:41 kkmm 阅读(213) 评论(0) 推荐(0) 编辑
[转]C++ string学习
摘要:C++中string是标准库中一种容器,相当于保存元素类型为char的vector容器(自己理解),这个类提供了相当丰富的函数来完成对字符串操作,以及与C风格字符串之间转换,下面是对string一些总结<引用>一,C语言的字符串在C语言里,对字符串的处理一项都是一件比较痛苦的事情,因为通常在实现字符串的操作的时候都会用到最不容易驾驭的类型——指针。比如下面这个例子://example 1:char str[12] = "Hello";char *p = str;*p = 'h'; //改变第一个字母//example 2:char *ptr = 阅读全文
posted @ 2012-12-05 10:08 kkmm 阅读(238) 评论(0) 推荐(0) 编辑
Finding all unique triplets that sums to zero[部分转载]
摘要:题目:http://www.leetcode.com/2010/04/finding-all-unique-triplets-that-sums.html分析:首先brute force,O(n3)。i j k从0到n-1各循环一遍,肯定不能要。其次,我们先假设只有2个数,对于一个排序的数组来说,如果想要a + b = 0,那么可以两个指针,一个在head(),一个在tail(),然后判断这两个it的值相加是否等于0,如果小于,那么前面的指针++,如果大于,那么后面的指针--,直到指针相遇或者找到和为0的一对。这使得2个数字的算法复杂度由O(n2) -> O(n)。然后,对于3个数字的相 阅读全文
posted @ 2012-12-03 18:17 kkmm 阅读(304) 评论(0) 推荐(0) 编辑
My Solution to Lowest Common Ancestor of a Binary Tree Part I(Bottom-up Approach)
摘要:题目:http://www.leetcode.com/2011/07/lowest-common-ancestor-of-a-binary-tree-part-i.html#include <iostream>using namespace std;struct Node{ int value; Node *pLeft; Node *pRight;};Node *CreateNode(int v){ Node *pNode = new Node(); if (!pNode) return NULL; pNode->value = v; p... 阅读全文
posted @ 2012-12-03 16:25 kkmm 阅读(244) 评论(0) 推荐(0) 编辑
My Solution to Lowest Common Ancestor of a Binary Tree Part I(Top-Down Approach)
摘要:题目在:http://www.leetcode.com/2011/07/lowest-common-ancestor-of-a-binary-tree-part-i.html自己将上述网址中的 Top-Down Approach 重写了一遍,为了练手。这个方法是基础的方法,复杂度为O(n2),简而言之就是先判断p q是在不同的子树还是相同的子树里,如果不同,那么root就是LCA,如果相同,那么递归。代码如下:#include <iostream>using namespace std;struct Node{ int value; Node *pLeft; Node *pR... 阅读全文
posted @ 2012-12-03 15:58 kkmm 阅读(188) 评论(0) 推荐(0) 编辑
[转]struct 和typedef struct什么区别
摘要:转自:http://www.cnblogs.com/qyaizs/articles/2039101.html分三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef: typedef struct Student { int a; }Stu; 于是在声明变量的时候就可:Stu stu1;(如果没有typedef就必须用struct Student stu1;来声明) 这里的Stu实际上就是struct Student的别名。Stu==struct Student 另外这里也可以不写Student(于是也不... 阅读全文
posted @ 2012-12-03 15:29 kkmm 阅读(177) 评论(0) 推荐(0) 编辑
[转]尾部递归(递归转循环)
摘要:转自:http://www.cnblogs.com/candyming/archive/2011/12/04/2275448.html尾部递归是一种编程技巧。递归函数是指一些会在函数内调用自己的函数,如果在递归函数中,递归调用返回的结果总被直接返回,则称为尾部递归。尾部递归的函数有助将算法转化成函数编程语言,而且从编译器角度来说,亦容易优化成为普通循环。这是因为从电脑的基本面来说,所有的循环都是利用重复移跳到代码的开头来实现的。如果有尾部归递,就只需要叠套一个 stack,因为电脑只需要将函数的 parameter 改变再重新跑一次。例如,可以把上一次函数的输出当作下一次的输入。然而,利用尾部 阅读全文
posted @ 2012-12-03 12:51 kkmm 阅读(2526) 评论(0) 推荐(0) 编辑
My Solution to Lowest Common Ancestor of a Binary Search Tree (BST)
摘要:题目:http://www.leetcode.com/2011/07/lowest-common-ancestor-of-a-binary-search-tree.html思路,先判断入口是否有非法输入。1 如果某一个root==p || root == q,那么LCA肯定是root(因为是top down,LCA肯定在root所囊括的树上,而root又是p q其中一个节点了,那么另外一个节点肯定在root之下,那么root就是LCA),那么返回root2 如果root<min(p, q),那么LCA肯定在右子树上,那么递归3如果max(p, q)<root,那么LCA肯定在左子树 阅读全文
posted @ 2012-12-03 12:42 kkmm 阅读(2205) 评论(0) 推荐(0) 编辑


点击右上角即可分享
微信分享提示