算法
Mir2
爱好编程,游戏
展开
-
LintCode 买卖股票的最佳时机I II III IV
今天上午我做了LintCode上的买卖股票系列题目。总共4道题目,主要使用了动态规划的方法,在此写出我的代码和思路以便交流和回顾。原创 2016-04-07 09:09:16 · 8222 阅读 · 0 评论 -
LintCode 迷你推特
实现一个迷你的推特,支持下列几种方法1.postTweet(user_id, tweet_text). 发布一条推特.2.getTimeline(user_id). 获得给定用户最新发布的十条推特,按照发布时间从最近的到之前排序3.getNewsFeed(user_id). 获得给定用户的朋友或者他自己发布的最新十条推特,从发布时间最近到之前排序4.follow(from_us原创 2016-10-20 22:21:43 · 500 阅读 · 0 评论 -
LintCode 正则表达式匹配
实现支持'.'和'*'的正则表达式匹配。'.'匹配任意一个字母。'*'匹配零个或者多个前面的元素。匹配应该覆盖整个输入字符串,而不仅仅是一部分。需要实现的函数是:bool isMatch(const char *s, const char *p)思路:逐字匹配,遇到*号递归搜索所有可能的情况看是否匹配可能有优化算法clas原创 2016-10-19 21:42:15 · 730 阅读 · 0 评论 -
LintCode 插入区间
给出一个无重叠的按照区间起始端点排序的区间列表。在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。样例插入区间[2, 5] 到 [[1,2], [5,9]],我们得到 [[1,9]]。插入区间[3, 4] 到 [[1,2], [5,9]],我们得到 [[1,2], [3,4], [5,9]]。分析原创 2016-11-14 10:38:30 · 404 阅读 · 0 评论 -
LintCode 最长上升子序列
给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。说明最长上升子序列的定义:最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低到高排列的子序列,这种子序列不一定是连续的或者唯一的。https://en.wikipedia.org/wiki/Longest_increasing_subsequence解法:之前一直没弄清这原创 2016-11-11 10:23:51 · 313 阅读 · 0 评论 -
LintCode 完美平方
给一个正整数 n, 找到若干个完全平方数(比如1, 4, 9, ... )使得他们的和等于 n。你需要让平方数的个数最少。样例给出 n = 12, 返回 3 因为 12 = 4 + 4 + 4。给出 n = 13, 返回 2 因为 13 = 4 + 9。思路:递归搜索所有可能的平方数组合,找出个数最少的第一次提交超时了,后来限制递归层数为当前找到的最原创 2016-11-19 17:33:13 · 387 阅读 · 0 评论 -
LintCode 不同的子序列
给出字符串S和字符串T,计算S的不同的子序列中T出现的个数。子序列字符串是原始字符串通过删除一些(或零个)产生的一个新的字符串,并且对剩下的字符的相对位置没有影响。(比如,“ACE”是“ABCDE”的子序列字符串,而“AEC”不是)。 样例给出S = "rabbbit", T = "rabbit"返回 3分析:首先想到的是深度优先搜索,递归找原创 2016-12-03 11:54:32 · 375 阅读 · 0 评论 -
LintCode 交换链表当中两个节点
给你一个链表以及两个权值v1和v2,交换链表中权值为v1和v2的这两个节点。保证链表中节点权值各不相同,如果没有找到对应节点,那么什么也不用做。样例给出链表 1->2->3->4->null ,以及 v1 = 2 , v2 = 4返回结果 1->4->3->2->null。分析:找到两个节点和它们的前节点,把两个节点的前后节点都交换即可。要注意两个节点相邻和头节原创 2016-11-27 17:20:41 · 416 阅读 · 0 评论 -
LintCode 打劫房屋 I II III
打劫房屋是典型的动态规划问题,面试经常考,LintCode 上有 3 道题,总结一下做法。打劫房屋 I假设你是一个专业的窃贼,准备沿着一条街打劫房屋。每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警。给定一个非负整数列表,表示每个房子中存放的钱, 算一算,如果今晚去打劫,你最多可以得原创 2017-04-13 11:49:24 · 535 阅读 · 0 评论 -
LintCode 最长公共子序列
给出两个字符串,找到最长公共子序列(LCS),返回LCS的长度。最长公共子序列的定义:最长公共子序列问题是在一组序列(通常2个)中找到最长公共子序列(注意:不同于子串,LCS不需要是连续的子串)。该问题是典型的计算机科学问题,是文件差异比较程序的基础,在生物信息学中也有所应用。https://en.wikipedia.org/wiki/Longest_common_su原创 2017-04-05 14:57:18 · 454 阅读 · 0 评论 -
LintCode 安排课程
你需要去上n门九章的课才能获得offer,这些课被标号为 0 到 n-1 。有一些课程需要“前置课程”,比如如果你要上课程0,你需要先学课程1,我们用一个匹配来表示他们: [0,1]给你课程的总数量和一些前置课程的需求,返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。样例给定 n =原创 2017-05-25 14:44:56 · 1592 阅读 · 0 评论 -
LintCode 132 Pattern
Given a sequence of n integers a1, a2, ..., an, a 132 pattern is a subsequence ai, aj, ak such that i j k and ai ak aj. Design an algorithm that takes a list of n numbers as input and checks wheth原创 2017-06-21 16:19:25 · 434 阅读 · 0 评论 -
LintCode 通配符匹配
判断两个可能包含通配符“?”和“*”的字符串是否匹配。匹配规则如下:'?' 可以匹配任何单个字符。'*' 可以匹配任意字符串(包括空字符串)。两个串完全匹配才算匹配成功。函数接口如下:bool isMatch(const char *s, const char *p)解法:?字符好处理,*字符首先尝试搜索所有可能情况结果超时最后改成先按照前面的*字符按照最小匹配,最后一原创 2016-10-18 20:50:30 · 335 阅读 · 0 评论 -
LintCode 两个排序数组的中位数
两个排序的数组A和B分别含有m和n个数,找到两个排序数组的中位数,要求时间复杂度应为O(log (m+n))。样例给出数组A = [1,2,3,4,5,6] B = [2,3,4,5],中位数3.5给出数组A = [1,2,3] B = [4,5],中位数 3思路一:排序数组中中位数是正中间的那个数,若数组长度为偶数则中位数是正中间的两个数的平均数最简单原创 2016-11-09 17:52:52 · 264 阅读 · 0 评论 -
LintCode 表达树构造(栈,二叉树)
LintCode上的一道题,表达树构造,大意是给出一个算术表达式,要我们构造它的表达树。原创 2016-04-16 22:41:56 · 614 阅读 · 0 评论 -
LintCode统计前面比自己小的数的个数(线段树)
LintCode 249.统计前面比自己小的数的个数用到了线段树,这种数据结构在数值范围不大的情况下可以很方便地达到o(logn)的查找效率。做过 线段树的构造, 线段树的查询 II后再做就不难了。原创 2016-04-15 00:04:02 · 2272 阅读 · 0 评论 -
LintCode 单词切分
给出一个字符串s和一个词典,判断字符串s是否可以被空格切分成一个或多个出现在字典中的单词。解法:使用深度优先搜索找出可能的切分方式。用递归实现报错了,改成循环实现通过,应该有更好的方法。class Solution {public: /** * @param s: A string s * @param dict: A dictiona原创 2016-09-21 10:22:34 · 663 阅读 · 0 评论 -
LintCode-最长连续序列
给定一个未排序的整数数组,找出最长连续序列的长度。要求你的算法复杂度为O(n)解法一对数组排序遍历找出最长连续序列,要注意有重复数字的情况 int longestConsecutive(vector &num) { // write you code here if(num.size() == 0) return 0;原创 2016-09-26 17:02:25 · 330 阅读 · 0 评论 -
LintCode-拓扑排序
给定一个有向图,图节点的拓扑排序被定义为:对于每条有向边A--> B,则A必须排在B之前 拓扑排序的第一个节点可以是任何在图中没有其他节点指向它的节点 找到给定图的任一拓扑排序 解法: 计算所有节点的入度 选择一个入度为零的节点输出,并将其子节点的入度减1 循环直到所有节点输出 第一次超时了,后来减少了查表次原创 2016-09-26 10:57:49 · 447 阅读 · 0 评论 -
LintCode 单词搜索 II
给出一个由小写字母组成的矩阵和一个字典。找出所有同时在字典和矩阵中出现的单词。一个单词可以从矩阵中的任意位置开始,可以向左/右/上/下四个相邻方向移动。解法:建立字典树存储所有要找的单词,在一个单词的最后一个字符节点上存储该单词指针沿着字典树节点在矩阵中搜索,碰到单词的最后一个字符节点就表示找到该单词,记录到结果中class DicNode {public: Di原创 2016-11-03 17:57:05 · 928 阅读 · 0 评论 -
LintCode 二叉树的锯齿形层次遍历
给出一棵二叉树,返回其节点值的锯齿形层次遍历(先从左往右,下一层再从右往左,层与层之间交替进行) 解法:树的层序遍历,遍历的时候判断这一层是从左到右还是从右到左 vector> zigzagLevelOrder(TreeNode *root) { // write your code here vector> r; if(r原创 2016-10-24 11:27:40 · 340 阅读 · 0 评论 -
LintCode 落单的数 II
给出3*n + 1 个的数字,除其中一个数字之外其他每个数字均出现三次,找到这个数字。解法:位操作,统计所有数字各个位上数字的和,除以3取余就是落单数在这个位上的值 int singleNumberII(vector &A) { // write your code here int buf[32] = {0};原创 2016-10-15 15:43:09 · 417 阅读 · 0 评论 -
LintCode k数和 II
给定n个不同的正整数,整数k(1k 在这n个数里面找出K个数,使得这K个数的和等于目标数字,你需要找出所有满足要求的方案。样例给出[1,2,3,4],k=2, target=5,返回 [[1,4],[2,3]]思路:递归的方式找出所有可能的k个数的组合,符合要求的存入结果中 vector > kSumII(vector A, i原创 2016-11-10 10:21:36 · 441 阅读 · 0 评论 -
LintCode Word Break II
题目Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.Return all such possible sentences.样例Gieve s =原创 2017-09-04 18:30:33 · 557 阅读 · 0 评论