lintcode
文章平均质量分 73
guoziqing506
这个作者很懒,什么都没留下…
展开
-
递归(斐波那契数列)
递归是一种极为常用的编程思想。比较官方的解释是“可以在函数内部,直接或间接地调用函数自身”,我一般把他称为“一种有技术含量的偷懒算法”。为什么这么说呢?因为递归函数不需要我们对运算过程的每一步的细节了解详细,而只需要我们知道两点:1. 函数是如何“升级”的。也就是这一步需要解决的问题与其子问题之间的关系2. 函数到什么位置“触底”,“触底”后返回什么?原创 2016-04-04 19:26:47 · 1391 阅读 · 0 评论 -
线段树的构造
题目描述:线段树是一棵二叉树,他的每个节点包含了两个额外的属性start和end用于表示该节点所代表的区间。start和end都是整数,并按照如下的方式赋值:根节点的 start 和 end 由 build 方法所给出。对于节点 A 的左儿子,有 start=A.left, end=(A.left + A.right) / 2。对于节点 A 的右儿子,有 start=(A.left +原创 2016-07-29 16:44:12 · 783 阅读 · 0 评论 -
线段树的构造 II
题目描述:线段树是一棵二叉树,他的每个节点包含了两个额外的属性start和end用于表示该节点所代表的区间。start和end都是整数,并按照如下的方式赋值:根节点的 start 和 end 由 build 方法所给出。对于节点 A 的左儿子,有 start=A.left, end=(A.left + A.right) / 2。对于节点 A 的右儿子,有 start=(A.left +原创 2016-07-30 10:51:49 · 642 阅读 · 0 评论 -
两数组的交
题目描述:返回两个数组的交样例:nums1 = [1, 2, 2, 1], nums2 = [2, 2], 返回 [2].这个题的意思是返回两个数组中相同的数,但是不包含重复。题目本身太简单了,但是方法有很多,其实题目的挑战也就在于用多种方法实现这个功能,在这里,我为大家介绍3种方法;1. 集合2. 哈希表3. 排序+两根指针先说使用集合数据类型,这是最简单的方原创 2016-06-02 11:56:14 · 1778 阅读 · 0 评论 -
线段树查询 II
题目描述:对于一个数组,我们可以对其建立一棵 线段树, 每个结点存储一个额外的值 count 来代表这个结点所指代的数组区间内的元素个数. (数组中并不一定每个位置上都有元素) 实现一个 query 的方法,该方法接受三个参数 root, start 和 end, 分别代表线段树的根节点和需要查询的区间,找到数组中在区间[start, end]内的元素个数。样例:对于数组 [0原创 2016-07-31 09:37:49 · 765 阅读 · 0 评论 -
线段树的查询
题目描述:对于一个有n个数的整数数组,在对应的线段树中, 根节点所代表的区间为0-n-1, 每个节点有一个额外的属性max,值为该节点所代表的数组区间start到end内的最大值。为SegmentTree设计一个 query 的方法,接受3个参数root, start和end,线段树root所代表的数组中子区间[start, end]内的最大值。样例:对于数组 [1, 4, 2,原创 2016-07-30 19:59:18 · 1381 阅读 · 0 评论 -
线段树的修改
题目描述:对于一棵 最大线段树, 每个节点包含一个额外的 max 属性,用于存储该节点所代表区间的最大值。设计一个 modify 的方法,接受三个参数 root、 index 和 value。该方法将 root 为跟的线段树中 [start, end] = [index, index] 的节点修改为了新的 value ,并确保在修改后,线段树的每个节点的 max 属性仍然具有正确的值。原创 2016-07-31 11:58:29 · 585 阅读 · 0 评论 -
移动零
题目描述:给一个数组 nums 写一个函数将 0 移动到数组的最后面,非零元素保持原数组的顺序样例:给出 nums = [0, 1, 0, 3, 12], 调用函数之后, nums = [1, 3, 12, 0, 0].其实,仅就实现这个功能来说,我们当然可以选择先把所有的0统计出来,然后删除这些0,再在数组后面添加这些0.不过,这并不是这道题的本意,此题的本意是要我们熟悉数组原创 2016-07-21 10:09:47 · 2223 阅读 · 0 评论 -
合并区间
题目描述:给出若干闭合区间,合并所有重叠的部分。样例:给出的区间列表 => 合并后的区间列表:[ [ [1, 3], [1, 6], [2, 6], => [8, 10], [8, 10], [15, 18] [15, 18]原创 2016-07-18 15:52:47 · 1181 阅读 · 0 评论 -
数字组合 II
题目描述:给出一组候选数字(C)和目标数字(T),找出C中所有的组合,使组合中数字的和为T。C中每个数字在每个组合中只能使用一次。样例:给出一个例子,候选数字集合为[10,1,6,7,2,1,5] 和目标数字 8 , 解集为:[[1,7],[1,2,5],[2,6],[1,1,6]]跟上一题“数字组合”(详见:点击打开链接)其实是一样的,只不过此时不允许列表中的数字被重复利用了。那原创 2016-07-18 13:45:25 · 1115 阅读 · 0 评论 -
删除排序数组中的重复数字
题目描述:给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度。不要使用额外的数组空间,必须在原地没有额外空间的条件下完成。样例:给出数组A =[1,1,2],你的函数应该返回长度2,此时A=[1,2]。主要是看清题目,题目要求是三点:1. 返回去重后数组的长度2. 原数组要变,变成没有重复元素的,但是不用返回3. 没有额外空间(也就是原创 2016-05-13 15:38:36 · 2304 阅读 · 0 评论 -
恢复旋转排序数组
题目描述:给定一个旋转排序数组,在原地恢复其排序。样例:[4, 5, 1, 2, 3] -> [1, 2, 3, 4, 5]数组这一部分,很多题目是非常简单的,更多是考察对语言编写的能力,所以,我会在接下来好几节里,简洁快速地将这些题目过一遍,而不对算法细节做过多讲解(因为简单)。先看这道题目,旋转排序数组的问题,之前已经讲过(详见:点击打开链接)那个时候,是要寻找旋转排序数组的最小值原创 2016-05-13 15:28:48 · 1531 阅读 · 0 评论 -
奇偶分割数组
题目描述:分割一个整数数组,使得奇数在前偶数在后。样例:给定 [1, 2, 3, 4],返回 [1, 3, 2, 4]。想想在快速排序中,每一次递归是如何调整元素位置的。通过依次遍历,交换的方法,如果记不得了,可以点回去看看(详见:点击打开链接)所以,这个题类似,直接写出代码就行了:class Solution: # @param nums: a list of integ原创 2016-05-12 15:27:04 · 725 阅读 · 0 评论 -
最小子数组
题目描述:给定一个整数数组,找到一个具有最小和的子数组。返回其最小和。样例:给出数组[1, -1, -2, 1],返回 -3上一道题,已经讲过最大子数组是如何处理的了(详见:点击打开链接),这道题,稍微做一点修改即可。既然求最小,那么只要是大于0的前n位和就不能要。代码几乎和上一道题一模一样:class Solution: """ @param nums: a原创 2016-05-12 13:48:07 · 1181 阅读 · 1 评论 -
最大子数组
题目描述:给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。样例:给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2,1],其最大和为6如果数组全是正数,那么最大子数组当然就是整个数组了。正因为穿插了负数,才让这道题有点难度。所以,思路是这样的:1. 依次求取前n位的和, 那么,当然有两种情况:和为正;和为负2. 如果和为原创 2016-05-12 13:21:28 · 1575 阅读 · 2 评论 -
两数之和
题目描述:给一个整数数组,找到两个数使得他们的和等于一个给定的数target。你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是1到n,不是以0开头。样例:numbers=[2, 7, 11, 15], target=9, return [1, 2]可以先建立一个哈希表,键为数组中的元素,键所对应的值为数组的下标。这样的话,我们就原创 2016-05-11 11:11:12 · 1445 阅读 · 1 评论 -
硬币排成线
题目描述:有 n 个硬币排成一条线。两个参赛者轮流从右边依次拿走 1 或 2 个硬币,直到没有硬币为止。拿到最后一枚硬币的人获胜。请判定 第一个玩家 是输还是赢?样例:n = 1, 返回 true.n = 2, 返回 true.n = 3, 返回 false.n = 4, 返回 true.n = 5, 返回 true.好吧,我不得不承认,我并不知道这个题目考察的原创 2016-05-10 22:25:53 · 1105 阅读 · 0 评论 -
旋转链表
题目描述:给定一个链表,旋转链表,使得每个节点向右移动k个位置,其中k是一个非负数样例:给出链表1->2->3->4->5->null和k=2;返回4->5->1->2->3->null首先,观察一下这个题目要达到的目的,其实,换一种说法,可以这样来描述:给出一个k值,将链表从倒数第k个节点处起之后的部分移动到链表前面,就样例来说,其实是将4->5这一部分移动到整个链表前面,变成4->5-原创 2016-05-10 19:53:26 · 1984 阅读 · 0 评论 -
两个链表的交叉
题目描述:请写一个程序,找到两个单链表最开始的交叉节点。注意事项如果两个链表没有交叉,返回null;在返回结果后,两个链表仍须保持原有的结构;可假定整个链表结构中没有循环。两个链表交叉,其实就是在某一时刻,两个链表指向了同一个节点。那么,如果两个链表等长,这道题就毫无难度了,我们直接分别遍历两个链表,看在哪个节点处,两个链表的指向的节点是一样的。但是这道题并没有说链表等长,那也好办原创 2016-05-09 19:50:42 · 3836 阅读 · 0 评论 -
回文链表
题目描述:设计一种方式检查一个链表是否为回文链表。样例:1->2->1 就是一个回文链表。当设计检查字符串是否为回文字符串的时候,可以用两个指针分别从头尾往中间遍历。但是链表不行,因为链表是不能往前回溯的。所以我们可以设计这样一个方法:将链表从中间断开,然后令其中一部分翻转,再从头至尾遍历两个链表即可。这里面找链表的中间节点的方法和链表翻转,我们都在之前的内容中讲过(详见:翻转链表原创 2016-05-07 22:52:21 · 2649 阅读 · 2 评论 -
删除排序链表中的重复数字 II
题目描述:给定一个排序链表,删除所有重复的元素只留下原链表中没有重复的元素。样例:给出 1->2->3->3->4->4->5->null,返回 1->2->5->null;给出 1->1->1->2->3->null,返回 2->3->null还记得之前做过一道删除链表中重复元素的题(详见:点击打开链接),那道题中,我用了一个集合来存储出现过的元素,从而在遍历链表过程中决定节点的去留。但原创 2016-05-02 22:29:15 · 1207 阅读 · 0 评论 -
带环链表
题目描述:给定一个链表,判断它是否有环。样例:给出 -21->10->4->5, tail connects to node index 1,返回 true带环链表,只可能长成一下两种样子:因为一个节点,不可能有两个地址。所以,我们不妨先把这两种情况看做是两个跑道,那你想啊,如果有个比你跑得快的人,和你一起出发在跑道上跑,他迟早会套你的圈,左边这个图就不多说了,就是我们小时原创 2016-05-02 14:04:29 · 679 阅读 · 0 评论 -
翻转链表
题目描述:翻转一个链表样例:给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null一种比较简单的方法是用“摘除法”。就是先新建一个空节点,然后遍历整个链表,依次令遍历到的节点指向新建链表的头节点。那样例来说,步骤是这样的:1. 新建空节点:None2. 1->None3. 2->1->None4. 3->2->1->None代码就非常简原创 2016-05-02 12:01:43 · 810 阅读 · 0 评论 -
删除排序数组中的重复数字 II
题目描述:跟进“删除重复数字”:如果可以允许出现两次重复将如何处理?样例:给出数组A =[1,1,1,2,2,3],你的函数应该返回长度5,此时A=[1,1,2,2,3]。题目是上一道题“删除排序数组中的重复数字”(详见:点击打开链接)的延伸,现在要求可以保留出现两次的重复。那也很简单,用一个整型变量count来统计出现的次数,大于2了,就删。基本思路和上一道题一模一样。直接给代码原创 2016-05-13 17:12:53 · 714 阅读 · 0 评论 -
重排链表
题目描述:给定一个单链表L: L0→L1→…→Ln-1→Ln, 重新排列后为:L0→Ln→L1→Ln-1→L2→Ln-2→…必须在不改变节点值的情况下进行原地操作样例:给出链表1->2->3->4->null,重新排列后为1->4->2->3->null。将L0,L1; L1,Ln-1;...排在一起,其实和回文链表(详见:点击打开链接)的逻辑是一样的,不同的是,回文链表是比较值,这里原创 2016-05-09 23:23:34 · 5145 阅读 · 0 评论 -
翻转链表 II
题目描述:翻转链表中第m个节点到第n个节点的部分;注意事项:m,n满足1 ≤ m ≤ n ≤ 链表长度样例:给出链表1->2->3->4->5->null, m = 2 和n = 4,返回1->4->3->2->5->null之前,已经实现过普通的,对于整个链表的翻转(详见:点击打开链接),这里增加了一点难度,设置了翻转的位置。但是基本方法没变。难度主要在于“摘链”和“链接”的原创 2016-05-09 14:28:51 · 1930 阅读 · 0 评论 -
最长无重复字符的子串
题目描述:给定一个字符串,请找出其中无重复字符的最长子字符串。样例:例如,在"abcabcbb"中,其无重复字符的最长子字符串是"abc",其长度为 3。对于,"bbbbb",其无重复字符的最长子字符串为"b",长度为1。从头开始扫描字符串,通过一个哈希表来记录每个字符以及字符所在的位置,若新扫描的字符不在哈希表中,则继续向前;若在哈希表中(记为cur),则证明此时已经不是无重复字符的子串原创 2016-05-31 09:51:19 · 1088 阅读 · 0 评论 -
有效回文串
题目描述:给定一个字符串,判断其是否为一个回文串。只包含字母和数字,忽略大小写。样例:"A man, a plan, a canal: Panama" 是一个回文。"race a car" 不是一个回文。之前判断过一个链表十分是回文链表(详见:点击打开链接),字符串的判断比链表简单,因为可以从后往前回溯。但是在这道题当中,空格,标点,以及其他非字母或数字的字符是不能算在原创 2016-05-29 09:29:01 · 760 阅读 · 0 评论 -
旋转字符串
题目描述:给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转)样例:对于字符串 "abcdefg".offset=0 => "abcdefg"offset=1 => "gabcdef"offset=2 => "fgabcde"offset=3 => "efgabcd"这种旋转的问题,基本步骤是三步:1. 找到偏移量对字符串的余数,这是实际需要原创 2016-05-28 21:06:45 · 1079 阅读 · 1 评论 -
最长单词
题目描述:给一个词典,找出其中所有最长的单词。样例:在词典{ "dog", "google", "facebook", "internationalization", "blabla"}中, 最长的单词集合为 ["internationalization"]在词典{ "like", "love", "hate", "原创 2016-05-26 19:23:23 · 1157 阅读 · 1 评论 -
比较字符串
题目描述:比较两个字符串A和B,确定A中是否包含B中所有的字符。字符串A和B中的字符都是 大写字母样例:给出 A = "ABCD", B = "ACD",返回 true;给出 A = "ABCD", B = "AABC", 返回 false这里面需要注意的是A,B中可能有重复的字符。因此,既然是判断A是否全部包含B,可以这样做:1. 扫描A,然后用一个hash表记录A中出现的每一个原创 2016-05-26 12:50:49 · 1078 阅读 · 0 评论 -
最长公共前缀
题目描述:给k个字符串,求出他们的最长公共前缀(LCP)样例:在 "ABCD" "ABEF" 和 "ACEF" 中, LCP 为 "A";在 "ABCDEFG", "ABCEFG", "ABCEFA" 中, LCP 为 "ABC"其实最简单的方法,两两比较就行。我用的是这种思路:先找出字符串数组中最长的字符串(为方便描述,记为max_str),然后用max_str从数组的头开始依次比原创 2016-05-25 16:40:49 · 4165 阅读 · 0 评论 -
判断字符串是否没有重复字符
题目描述:实现一个算法确定字符串中的字符是否均唯一出现样例:给出"abc",返回 true;给出"aab",返回 false挑战 :如果不使用额外的存储空间,你的算法该如何改变?很简单的题目。最简单的方法是遍历数组,然后使用一个数据结构(列表,集合都可以)保存遍历到的元素,将新遍历到的元素与这个结构里面存储的元素相比较,若发现重复了,则返回False,若一直没有重复的,返回True。原创 2016-05-23 22:17:22 · 4366 阅读 · 0 评论 -
跳跃游戏 II
题目描述:给出一个非负整数数组,你最初定位在数组的第一个位置。数组中的每个元素代表你在那个位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。样例:给出数组A = [2,3,1,1,4],最少到达数组最后一个位置的跳跃次数是2(从数组下标0跳一步到数组下标1,然后跳3步到数组的最后一个位置,一共跳跃2次)跟上一道题:“跳跃游戏”(详见:点击打开链接)基本逻辑是一样的原创 2016-05-23 17:15:17 · 2676 阅读 · 0 评论 -
买卖股票的最佳时机 II
题目描述:假设有一个数组,它的第i个元素是一个给定的股票在第i天的价格。设计一个算法来找到最大的利润。你可以完成尽可能多的交易(多次买卖股票)。然而,你不能同时参与多个交易(你必须在再次购买前出售股票)。样例:给出一个数组样例[2,1,2,0,1], 返回 2这道题比上一道题“买卖股票的最佳时机”(详见:点击打开链接)还要简单。因为有不定次数的交易,所以,最“贪心”的办法就是只要明天的原创 2016-05-17 14:15:40 · 2233 阅读 · 0 评论 -
寻找缺失的数
题目描述:给出一个包含 0 .. N 中 N 个数的序列,找出0 .. N 中没有出现在序列中的那个数。样例:N = 4 且序列为 [0, 1, 3] 时,缺失的数为2。之前,有一道找寻第一个丢失的正整数(详见:点击打开链接)的问题。当时用的是桶排序(详见:点击打开链接)这题题呢,其实和上一道题没有本质不同了,完全可以用相同的方法解决。但是更简单,为什么呢?因为所有数组中可能出现的元素原创 2016-05-17 15:03:42 · 1485 阅读 · 0 评论 -
买卖股票的最佳时机
题目描述:假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格。如果你最多只允许完成一次交易(例如,一次买卖股票),设计一个算法来找出最大利润。样例:给出一个数组样例 [3,2,3,1,2], 返回 1 换一个角度来思考这个问题,最大利润实际上就是每天的交易价格,减去上一天的价格所构成的这个数组的最大子数组。有关最大子数组的解法已经讲过(详见:点击打开链接),不明白的请回看。原创 2016-05-17 11:34:55 · 3071 阅读 · 0 评论 -
主元素
题目描述:给定一个整型数组,找出主元素,它在数组中的出现次数严格大于数组元素个数的二分之一。样例:给出数组[1,1,1,1,2,2,2],返回 1两种方法可以用来解决这个问题:1. 中位数,因为主元素出现次数严格大于数组元素个数的二分之一,所以肯定是数组的中位数。而求取中位数的算法曾经讲过(详见:点击打开链接)2. 贪心法:因为元素个数大于数组的二分之一,所以,我们可以采用消除的方原创 2016-05-17 11:00:48 · 3535 阅读 · 0 评论 -
空格替换
题目描述:设计一种方法,将一个字符串中的所有空格替换成 %20 。你可以假设该字符串有足够的空间来加入新的字符,且你得到的是“真实的”字符长度。你的程序还需要返回被替换后的字符串的长度。样例:对于字符串"Mr John Smith", 长度为 13,替换空格之后,参数中的字符串需要变为"Mr%20John%20Smith",并且把新长度 17 作为结果返回。可以这样来考虑,因为数组足够长,原创 2016-05-28 23:26:41 · 753 阅读 · 1 评论 -
翻转字符串
题目描述:给定一个字符串,逐个翻转字符串中的每个单词。说明:单词的构成:无空格字母构成一个单词输入字符串是否包括前导或者尾随空格?可以包括,但是反转后的字符不能包括如何处理两个单词间的多个空格?在反转字符串中间空格减少到只含一个样例:给出s = "the sky is blue",返回"blue is sky the"建立一个空字符串,然后扫描给出的字符串,依次从前往后原创 2016-05-27 11:19:43 · 571 阅读 · 0 评论