摘要: 堆排序是一种常见的复杂度为log复杂度的算法,具体实现如下:void adjust_element(vector<int>& data, int i){ if (2 * i + 1 >= data.size()) return ; int index = 2 * i + 1; int min = data[index]; if (2 * i + 2 < data.size() && data[2 * i + 2] < min) { min = data[2 * i + 2]; index = 2 * i + 2; }... 阅读全文
posted @ 2013-01-03 21:22 David Luo 阅读(595) 评论(0) 推荐(0) 编辑
摘要: K个有序链表,用一个函数合并它们,并返回最终合并的结果:代码如下: ListNode *mergeKLists(vector<ListNode *> &lists) { // Start typing your C/C++ solution below // DO NOT write int main() function priority_queue<Node> q; ListNode L(1); ListNode* c = &L; L.next = NULL; for (int i = ... 阅读全文
posted @ 2013-01-03 19:24 David Luo 阅读(1204) 评论(0) 推荐(0) 编辑
摘要: 二叉排序树,是非常特殊的一种树,具体定义见任何一本数据结构书籍。其删除一个节点需要考虑对应节点的状态,具体的说就是,是否存在左右节点,等等。需要按照以下情况讨论。1.查找待删除节点,在查找的同时需要记录一下待删除节点的父亲。2.如果待删除节点的左右节点都不存在,那么直接删除。3.如果待删除节点左子树存在右子树不存在,或者左子树不存在右子树存在。直接将其子树中存在的一边候补上来即可。4.如果待删除节点左右子树都在,这个情况是最复杂的。需要按照二叉排序树的性质从其左子树或者有子树中选择节点补到待删除节点的位置。 如果从左子树中选,就应该选择左子树中最右边的那个叶子节点(这里肯定是叶子,如果不是叶. 阅读全文
posted @ 2013-01-03 16:27 David Luo 阅读(11211) 评论(1) 推荐(0) 编辑
摘要: Given a binary tree, determine if it is height-balanced.For this problem, a height-balanced binary tree is defined as a binary tree in which thedepth of the two subtreesofeverynode never differ by more than 1.刚开始的时候老往AVL树上靠,后来才知道只需要两个子树的高度 never differ by more than 1,这个就好理解多了。代码如下: bool balance(T... 阅读全文
posted @ 2013-01-03 15:33 David Luo 阅读(199) 评论(0) 推荐(0) 编辑
摘要: 二叉树是数据结构的基础,递归的版本是十分简单而且简洁,但是非递归版本就相对比较复杂些。1.前序非递归便利二叉树: 前序比较简单,从根开始访问,并一直往左,同时将访问后节点的右子树入栈(如果存在的话),直到栈空。void preorder(TreeNode* root){ stack<TreeNode*> st; if (root == NULL) return ; st.push(root); while (!st.empty()) { TreeNode* p = st.top(); st.pop(); while (p... 阅读全文
posted @ 2012-12-30 16:05 David Luo 阅读(1264) 评论(0) 推荐(0) 编辑
摘要: Given an unsorted integer array, find the first missing positive integer.For example,Given[1,2,0]return3,and[3,4,-1,1]return2.此题关键在于理解first missing positive intege。题意为:一共n个数,有正数有负数,还有0.找到一个最小的正数不在这个集合中可以分析得到,整个最小的正数,最小是1,最大是 n + 1.解法1:用hash保存一下每个元素,然后从1开始查,check是否在hash里面,不在输出即可。简单明了,但是如果空间复杂度有限制?即 不 阅读全文
posted @ 2012-12-30 11:40 David Luo 阅读(152) 评论(0) 推荐(0) 编辑
摘要: RT:Write a program to solve a Sudoku puzzle by filling the empty cells.Empty cells are indicated by the character'.'.You may assume that there will be only one unique solution.A sudoku puzzle......and its solution numbers marked in red.代码如下:不过有一个前提,有3×3的小方格内也必须满足不能出现相同数字的约定,所以回溯的时候加上了一个 阅读全文
posted @ 2012-12-29 21:56 David Luo 阅读(202) 评论(0) 推荐(0) 编辑
摘要: RT,给定字符串s1,s2判断能否通过重排列 s1 s2从而产生s3.注意s1 s2中字符的相对顺序不能变。如: s1 = abc s2 = def s3 = abcdef return true s3 = adefbc return true s3 = aefdbc return false思路:1.递归,很简单的思路,代码如下: bool Can(string s1, string s2, string s3) { if (s3.size() != s1.size() + s2.size()) return false; ... 阅读全文
posted @ 2012-12-29 14:32 David Luo 阅读(706) 评论(0) 推荐(0) 编辑
摘要: RT,在两个有序数组中找中位数或者第K大的元素.假设两个数组为A, B长度分别为m,n.分别是递增顺序。可以采用的算法有很多:首先想到的是类似MergeSort的方式,合并的同时找第K大元素,这个基本没难度,复杂度O(m + n)。不过此算法并不是最优,还有Log级别复杂度的算法,此算法其实很简单,远没有很多网站的代码那么玄乎,以下一一道来:首先明白几个前提:1.如果是求中位数,(m + n)是奇数还是偶数对结果是很有影响的,具体的如果(m + n)是奇数,中位数唯一,如果是偶数就有两个中位数,怎么取舍就看要求了。2.如果找到的第k大数(中位数类似)是 X ,如果X排在A中的 第Ax位置,X排 阅读全文
posted @ 2012-12-26 23:42 David Luo 阅读(15873) 评论(1) 推荐(0) 编辑
摘要: 晚上独自逛街,看到一双lining的羽毛球鞋,前bounse后cushion。中间挺透气的。一咬牙买了。花了323大洋。想想399就可以买到林丹战靴了。算了人总是很冲动的。况且这双鞋 还真不错。李宁的羽毛球鞋虽然是后起之秀,我穿了之后感觉比Victor好多了。底厚,减震感明显。不想Victor。以后我的装备除了拍子外一律转向lining。 晚上回到所里。看小弟,猪几个正在打,偶遂穿上新鞋,上场打球。小弟还带了一个DV机,很早就想用DV纠正下我的动作,苦于DV难寻,而今得来全不费功夫,兴奋!一共打了4场单打,两场双打都是11个球。所以时间不长。赛后看了我自己的视频,发现和专业的差距太大了。在此总 阅读全文
posted @ 2011-01-04 11:46 David Luo 阅读(227) 评论(0) 推荐(0) 编辑