随笔分类 -  算法练习

面试题级别的算法练习
摘要:题意是要求生成匹配的括号结果。假如给定n = 3,需要生成3对括号的有效组合,即"((()))", "(()())", "(())()", "()(())", "()()()"。 void unguarded_generate(vector<string> &result, string curr, int m, int n) { if (m == 0... 阅读全文
posted @ 2012-09-09 13:59 紫红的泪 阅读(3612) 评论(0) 推荐(0) 编辑
摘要:题意是给一个未排序的数组,可能包含正数、负数、0。求第一个未出现的正数,例如[1, 2, 0],由于第一个未出现的正数是3,返回3;[3, 4, -1, 1]第一个未出现的正数是2,返回2。算法要求O(n)时间复杂度及常数空间复杂度。 // Stable unguarded_partition, always put t to the left side. // I... 阅读全文
posted @ 2012-09-09 13:21 紫红的泪 阅读(1954) 评论(0) 推荐(0) 编辑
摘要:题意是求俩字符串的编辑距离,编辑定义有三种1、插入字符 2、删除字符 3、替换字符。 int minDistance(string word1, string word2) { if (word1.size() == 0) return (int)word2.size(); if (word2.size() == 0) return (... 阅读全文
posted @ 2012-09-09 10:59 紫红的泪 阅读(594) 评论(0) 推荐(0) 编辑
摘要:题意是计算a/b,其中a、b均为int,结果也要int。但是计算不允许使用乘法、除法、取模运算。 class Solution { public: // Divide two unsigned int once, using binary divide method. unsigned int unsigned_divide_on... 阅读全文
posted @ 2012-09-08 16:20 紫红的泪 阅读(1908) 评论(0) 推荐(0) 编辑
摘要:题意是1-26对应于A-Z,这样一个数字字符串可以解码成只包含A-Z的字符串。例如,12可以解码成AB,也可以解码成L。这样12就有两种解码方式。实现numDecodings(string s)接受数字字符串,返回可以解码的方式数。 int check(char one) { return (one != '0') ? 1 : 0; } ... 阅读全文
posted @ 2012-09-08 11:08 紫红的泪 阅读(1973) 评论(0) 推荐(0) 编辑
摘要:题意是n=1时输出字符串1;n=2时,数上次字符串中的数值个数,因为上次字符串有1个1,所以输出11;n=3时,由于上次字符是11,有2个1,所以输出21;n=4时,由于上次字符串是21,有1个2和1个1,所以输出1211。依次类推,写个countAndSay(n)函数返回字符串。 string unguarded_convert(const string &say) ... 阅读全文
posted @ 2012-09-05 11:44 紫红的泪 阅读(9554) 评论(3) 推荐(1) 编辑
摘要:题意是有个高度数组,就相当于隔板的高度,求数组中任意两隔板间盛水的最大量。隔板间的距离与较低隔板的高度乘积即为盛水的容量。 int maxArea(vector<int> &height) { int capability = 0; size_t left = 0, right = height.size() - 1; ... 阅读全文
posted @ 2012-09-05 11:00 紫红的泪 阅读(9911) 评论(0) 推荐(1) 编辑
摘要:实际上是个宝石迷阵消除游戏的简化版,把不同颜色的宝石看成不同值的数字,然后连通超过三个的可以消除。这里没有加入消除后降落的机制,一定程度上简化了问题的复杂度。那种需要每次消除后都从头遍历…… #include <iostream> using namespace std; template<typename T> T &val(T *... 阅读全文
posted @ 2012-09-04 23:20 紫红的泪 阅读(4025) 评论(0) 推荐(0) 编辑
摘要:面试到了一个topk,这个原理很简单,但是以前很少写过。面试时写的有点小慢,没有达到行云流水的地步。于是回来再写一遍练练。其中,堆排序部分采用简明排序代码。用完整的TopK代码: #include <iostream> #include <algorithm> using namespace std; template<typenam... 阅读全文
posted @ 2012-09-04 22:13 紫红的泪 阅读(9084) 评论(0) 推荐(0) 编辑
摘要:今天跟同学讨论面试题,又提到这个题了。之前在论坛里有人说是MSRA用过的面试题。题是这样的,假设有1棵二叉树,已知这棵树的节点上不均匀地分布了若干石头,石头数跟这棵二叉树的节点数相同。石头只能在子节点和父节点之间搬迁,每次只能搬运一块石头。请问如何以最少的步骤将石头搬运均匀,使得每个节点上的石头刚好为1。 我想到的是用后根遍历解,除了递归不需要额外空间,时间复杂度O(n)。 ... 阅读全文
posted @ 2012-09-02 17:51 紫红的泪 阅读(604) 评论(0) 推荐(0) 编辑
摘要:class Solution { public: vector<vector<int> > combine(int n, int k) { vector<int> vecTmp; m_vecRet.clear(); combination(1, n,... 阅读全文
posted @ 2012-09-01 21:08 紫红的泪 阅读(335) 评论(0) 推荐(0) 编辑
摘要:class Solution { public: vector<vector<int> > combinationSum2(vector<int> &num, int target) { vector<int> vecTmp; m_vecRet.clear(); ... 阅读全文
posted @ 2012-09-01 20:43 紫红的泪 阅读(1207) 评论(2) 推荐(0) 编辑
摘要:class Solution { public: vector<vector<int> > combinationSum(vector<int> &candidates, int target) { vector<int> vecTmp; m_vecRet.clear(); ... 阅读全文
posted @ 2012-09-01 19:45 紫红的泪 阅读(1287) 评论(0) 推荐(0) 编辑
摘要:爬楼梯,就是斐波纳契数列。 // f(n) = f(n - 1) + f(n - 2). // f(1) = 1. // f(2) = 2. int climbStairs(int n) { int a = 1, b = 2; int c = 0; if (n == 1) return a... 阅读全文
posted @ 2012-09-01 17:18 紫红的泪 阅读(1473) 评论(0) 推荐(0) 编辑
摘要:实现二叉树中序非递归遍历。 /** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left... 阅读全文
posted @ 2012-09-01 17:10 紫红的泪 阅读(1477) 评论(0) 推荐(0) 编辑
摘要:两个字符串的字符个数完全相同,这两个字符串是Anagrams。因此Anagrams至少指俩字符串。找出字符集合中的Anagrams组。 vector<string> anagrams(vector<string> &strs) { vector<string> ret; map<string, vector<const string *... 阅读全文
posted @ 2012-08-31 21:53 紫红的泪 阅读(2451) 评论(0) 推荐(0) 编辑
摘要:两个十进制数,反向存储在单向链表里,每位数占一个节点。求和的链表。 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), nex... 阅读全文
posted @ 2012-08-30 21:44 紫红的泪 阅读(2565) 评论(0) 推荐(0) 编辑
摘要:求数组中和为target的4个数,结果的4个数是非降序,结果集合不能有重复。跟3Sum一样的解法。 vector<vector<int> > fourSum(vector<int> &num, int target) { vector<vector<int> > ret; if (num.size() == 0) ret... 阅读全文
posted @ 2012-08-30 21:21 紫红的泪 阅读(2217) 评论(2) 推荐(0) 编辑
摘要:找到与target最接近的三个数的和。 int three_sum_closest(vector<int> &num, int target) { int result = 0; int dist = INT_MAX; sort(num.begin(), num.end()); ... 阅读全文
posted @ 2012-08-30 15:17 紫红的泪 阅读(1507) 评论(0) 推荐(0) 编辑
摘要:求和为指定值的三个数,麻烦的一点是,结果的集合不能有重复的。主要思路有两个,一个是在求值过程中过滤去重,还有一个是用hash。当然不能偷懒直接用set<vector<int> >,这样会直接超时。 // Dedup directly, // LeetCode Judge Large, 272 milli secs. vector<vector<int> > ... 阅读全文
posted @ 2012-08-30 15:00 紫红的泪 阅读(5024) 评论(0) 推荐(0) 编辑