LintCode
zhaokane
这个作者很懒,什么都没留下…
展开
-
链表划分-LintCode
给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前。 你应该保留两部分内链表节点原有的相对顺序。 样例: 给定链表 1->4->3->2->5->2->null,并且 x=3 返回 1->2->2->4->3->5->null#ifndef C96_H#define C96_H#include<iostream>using namespace std;cla原创 2017-07-10 15:20:22 · 192 阅读 · 0 评论 -
二叉树的最大深度-LintCode
给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶子节点的距离。 样例 给出一棵如下的二叉树: 思路: 递归地求二叉树的最大深度,节点的最大深度等于左右子树最大深度的最大值加一。#ifndef C97_H#define C97_H#include<iostream>using namespace std;class TreeNode{public...原创 2017-07-11 15:27:24 · 193 阅读 · 0 评论 -
链表排序-LintCode
在 O(n log n) 时间复杂度和常数级的空间复杂度下给链表排序。 样例: 给出 1->3->2->null,给它排序变成 1->2->3->null.#ifndef C98_H#define C98_H#include<iostream>using namespace std;class ListNode{public: int val; ListNode *ne原创 2017-07-11 16:52:48 · 238 阅读 · 0 评论 -
重排链表-LintCode
给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度。 不要使用额外的数组空间,必须在原地没有额外空间的条件下完成。 给定一个单链表L: L0→L1→…→Ln-1→Ln, 重新排列后为:L0→Ln→L1→Ln-1→L2→Ln-2→… 必须在不改变节点值的情况下进行原地操作。 样例: 给出链表 1->2->3->4->null,重新排列后为1->4原创 2017-07-12 09:02:58 · 344 阅读 · 0 评论 -
删除排序数组中的重复数字-LintCode
给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度。 不要使用额外的数组空间,必须在原地没有额外空间的条件下完成。 样例: 给出数组A =[1,1,2],你的函数应该返回长度2,此时A=[1,2]。#ifndef C100_H#define C100_H#include<iostream>#include<vector>using names原创 2017-07-12 09:26:35 · 304 阅读 · 0 评论 -
带环链表-LintCode
给定一个链表,判断它是否有环。 思想: 设置两个指针(fast, slow),初始值都指向头,slow每次前进一步,fast每次前进二步,如果链表存在环,则fast必定先进入环,而slow后进入环,两个指针必定相遇。#ifndef C102_H#define C102_H#include<iostream>using namespace std;class ListNode{publi原创 2017-07-12 10:13:48 · 174 阅读 · 0 评论 -
带环链表 II-LintCode
给定一个链表,如果链表中存在环,则返回到链表中环的起始节点的值,如果没有环,返回null。 样例 给出 -21->10->4->5, tail connects to node index 1,返回10#ifndef C103_H#define C103_H#include<iostream>using namespace std;class ListNode{public:原创 2017-07-12 10:54:17 · 246 阅读 · 0 评论 -
落单的数-LintCode
给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字。 样例 给出 [1,2,2,1,3,4,3],返回 4 挑战 一次遍历,常数级的额外空间复杂度 位操作^=class Solution {public: int singleNumber(vector<int> &A) { int x; for (int i =原创 2017-07-03 10:39:04 · 191 阅读 · 0 评论 -
合并k个排序链表-LintCode
合并k个排序链表,并且返回合并后的排序链表。尝试分析和描述其复杂度。 样例: 给出3个排序链表[2->4->null,null,-1->null],返回 -1->2->4->null .h#ifndef C104_H#define C104_H#include<iostream>#include<vector>using namespace std;class ListNode{p原创 2017-07-12 15:11:32 · 232 阅读 · 0 评论 -
最长公共子串-LintCode
给出两个字符串,找到最长公共子串,并返回其长度。 注意事项: 子串的字符应该连续的出现在原字符串中,这与子序列有所不同。 样例: 给出A=“ABCD”,B=“CBCE”,返回 2 思想: dp[i][j]表示以A[i],B[j]为结束字符的字符串,其最长公共子串的长度。由于要保证子串的连续性,若A[i]!=B[j],则dp[i][j]为0,否则为dp[i-1][j-1]+1。#if...原创 2017-06-30 15:37:15 · 306 阅读 · 0 评论 -
数组划分--lintcode
问题描述:详见:http://www.lintcode.com/zh-cn/problem/partition-array/给出一个整数数组 nums 和一个整数 k。划分数组(即移动数组 nums 中的元素),使得:所有小于k的元素移到左边所有大于等于k的元素移到右边返回数组划分的位置,即数组中第一个位置 i,满足 nums[i] 大于等于 k。注意事项:原创 2017-04-26 13:47:06 · 272 阅读 · 0 评论 -
Lintcode 上一个排列
给定一个整数数组来表示排列,找出其上一个排列。样例 给出排列[1,3,2,3],其上一个排列是[1,2,3,3] 给出排列[1,2,3,4],其上一个排列是[4,3,2,1]解释:所谓的上一个排列其实就是把给定数字组合,并从大到小排列,找到与给定排列最接近,且比它小的排列(即其上一个排列)。 比如:[1,3,2,3],上一个是[1,2,3,3],下一个是[1,3,3,2]是按升序排列...原创 2017-05-17 11:12:15 · 388 阅读 · 0 评论 -
落单的数 II-LintCode
给出3*n + 1 个的数字,除其中一个数字之外其他每个数字均出现三次,找到这个数字。 样例: 给出 [1,1,2,3,3,3,2,2,4,1] ,返回 4 挑战 : 一次遍历,常数级的额外空间复杂度 思想: 利用位运算,若一个数字出现3次,则该数字的二进制表示中每个位置数值为1出现的次数均为3次。用one表示出现一次,two表示出现两次,three表示出现三次。出现两次即为one中出现原创 2017-07-03 13:26:25 · 250 阅读 · 0 评论 -
落单的数 III-LintCode
给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字。 样例: 给出 [1,2,2,3,4,4,5,3],返回 1和5 挑战: O(n)时间复杂度,O(1)的额外空间复杂度 思路: 按照“落单的数”第一题的方法,我们可以轻松的到要求的两个数的异或值(Xor),关键在于如何把两个数字拆分出来。我们知道,在Xor中值为1的位,两个数在这个位置上,值是不同的。不原创 2017-07-03 14:38:15 · 176 阅读 · 0 评论 -
在二叉查找树中插入节点-LintCode
给定一棵二叉查找树和一个新的树节点,将节点插入到树中。 你需要保证该树仍然是一棵二叉查找树。 样例: 给出如下一棵二叉查找树,在插入节点6之后这棵二叉查找树可以是这样的: #ifndef C85_H#define C85_H#include<iostream>using namespace std;class TreeNode{public: int val; Tr原创 2017-07-03 17:08:34 · 195 阅读 · 0 评论 -
二叉查找树迭代器-LintCode
设计实现一个带有下列属性的二叉查找树的迭代器: 元素按照递增的顺序被访问(比如中序遍历) next()和hasNext()的询问操作要求均摊时间复杂度是O(1) 样例: 对于下列二叉查找树,使用迭代器进行中序遍历的结果为 [1, 6, 10, 11, 12] .h#ifndef C86_H#define C86_H#include<iostream>#include<stack>原创 2017-07-04 09:19:26 · 254 阅读 · 0 评论 -
复制带随机指针的链表-LintCode
给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点。 返回一个深拷贝的链表。 #ifndef C105_H#define C105_H#include<iostream>using namespace std;struct RandomListNode{ int label; RandomListNode *next, *random;原创 2017-07-12 16:17:41 · 192 阅读 · 0 评论 -
排序列表转换为二分查找树-LintCode
给出一个所有元素以升序排序的单链表,将它转换成一棵高度平衡的二分查找树 样例: #ifndef C106_H#define C106_H#include<iostream>using namespace std;class TreeNode{public: int val; TreeNode *left, *right; TreeNode(int val){原创 2017-07-13 09:15:04 · 198 阅读 · 0 评论 -
删除二叉查找树的节点-LintCode
给定一棵具有不同节点值的二叉查找树,删除树中与给定值相同的节点。如果树中没有相同值的节点,就不做任何处理。你应该保证处理之后的树仍是二叉查找树。 样例: #ifndef C87_H#define C87_H#include<iostream>using namespace std;class TreeNode{public: int val; TreeNode *lef原创 2017-07-04 13:45:25 · 233 阅读 · 0 评论 -
合并排序数组 II
合并排序数组 II合并两个排序的整数数组A和B变成一个新的数组。 *注意事项: 你可以假设A具有足够的空间(A数组的大小大于或等于m+n)去添加B中的元素。 样例 给出 A = [1, 2, 3, empty, empty], B = [4, 5] 合并之后 A 将变成 [1,2,3,4,5]#ifndef C64_H#define C64_H#include<iostream>us原创 2017-06-21 14:54:46 · 193 阅读 · 0 评论 -
二叉树的前序遍历
二叉树的前序遍历 给出一棵二叉树,返回其节点值的前序遍历。您在真实的面试中是否遇到过这个题? Yes 样例 给出一棵二叉树 {1,#,2,3}, 1 \ 2 / 3返回 [1,2,3].挑战 你能使用非递归实现么?#ifndef C66_H#define C66_H#include<vector>#inc...原创 2017-06-21 20:12:51 · 263 阅读 · 0 评论 -
二叉树的后序遍历
具体方法: 构建两个结点,一为当前结点(current),另一个为上次访问结点(lastVisited),并构建堆栈用于存放结点。若结点不为空,则从此节点开始,遍历左子树,并将结点依此压栈。取当前结点为栈顶结点,如果当前节点的右子树为空,或是上次访问的结点(证明已经遍历此节点的左子树与右子树),则出栈,并将此节点的值存入vector中,中有再将当前结点赋予上次访问结点,当前结点置空。 .he原创 2017-06-22 16:00:35 · 338 阅读 · 0 评论 -
二叉树层次遍历-LintCode
给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问) 给一棵二叉树 {3,9,20,#,#,15,7} 遍历结果: [ [3], [9,20], [15,7] ] 主要思想: 为了层次遍历,就要一层一层地处理数据。先将根节点入队,之后搜寻其左子树与右子树,若非空,则入队,并将根节点出队。按照此方法,依此处理。#ifndef C69_H#defi...原创 2017-06-26 19:21:06 · 331 阅读 · 0 评论 -
二叉树的层次遍历 II -LintCode
给出一棵二叉树,返回其节点值从底向上的层次序遍历(按从叶节点所在层到根节点所在的层遍历,然后逐层从左往右遍历) 按照从下往上的层次遍历为: [ [15,7], [9,20], [3] ]#ifndef C70_H#define C70_H#include<iostream>#include<vector>#include<q...原创 2017-06-26 20:31:00 · 302 阅读 · 0 评论 -
二叉树的锯齿形层次遍历-LintCode
给出一棵二叉树,返回其节点值的锯齿形层次遍历(先从左往右,下一层再从右往左,层与层之间交替进行) 给出一棵二叉树 {3,9,20,#,#,15,7} 返回其锯齿形的层次遍历为: [ [3], [20,9], [15,7] ] 基本思想与二叉树的层次遍历一致,只不过隔行要改变层次遍历的方向。#ifndef C71_H#define C71_H#include<io原创 2017-06-26 20:41:39 · 421 阅读 · 0 评论 -
前序遍历和中序遍历树构造二叉树-LintCode
描述: 根据前序遍历和中序遍历树构造二叉树. 样例: 给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树: 2 / \1 3思路: 递归构造二叉树,preorder第一个元素rootval作为根节点,在inorder中寻找rootval得到rootIter,rootIter左边元素位于根节点的左子树,右边元素位于根节点的右子树。 对于preord...原创 2017-06-27 13:54:20 · 595 阅读 · 0 评论 -
寻找峰值-LintCode
你给出一个整数数组(size为n),其具有以下特点: 相邻位置的数字是不同的 A[0] < A[1] 并且 A[n - 2] > A[n - 1] 假定P是峰值的位置则满足A[P] > A[P-1]且A[P] > A[P+1],返回数组中任意一个峰值的位置。 注意事项: 数组可能包含多个峰值,只需找到其中的任何一个即可 样例 给出数组[1, 2, 1, 3, 4, 5, 7, 6]返回原创 2017-06-29 10:39:10 · 272 阅读 · 0 评论 -
最长公共子序列-LintCode
给出两个字符串,找到最长公共子序列(LCS),返回LCS的长度。 说明 最长公共子序列的定义: 最长公共子序列问题是在一组序列(通常2个)中找到最长公共子序列(注意:不同于子串,LCS不需要是连续的子串)。该问题是典型的计算机科学问题,是文件差异比较程序的基础,在生物信息学中也有所应用。 https://en.wikipedia.org/wiki/Longest_common_subseq...原创 2017-06-29 14:53:14 · 278 阅读 · 0 评论 -
最长公共前缀 -LintCode
给k个字符串,求出他们的最长公共前缀(LCP) 样例 在 “ABCD” “ABEF” 和 “ACEF” 中, LCP 为 “A” 在 “ABCDEFG”, “ABCEFG”, “ABCEFA” 中, LCP 为 “ABC”#ifndef C78_H#define C78_H#include<iostream>#include<vector>#include<string>using原创 2017-06-29 15:35:47 · 529 阅读 · 0 评论 -
中位数-LintCode
给定一个未排序的整数数组,找到其中位数。 中位数是排序后数组的中间值,如果数组的个数是偶数个,则返回排序后数组的第N/2个数。样例 给出数组[4, 5, 1, 2, 3], 返回 3 给出数组[7, 9, 4, 5],返回 5 时间复杂度为O(n)#ifndef C80_H#define C80_H#include&lt;iostream&gt;#include&lt;vec...原创 2017-06-30 17:08:39 · 359 阅读 · 0 评论 -
数据流中位数-LintCode
数字是不断进入数组的,在每次添加一个新的数进入数组的同时返回当前新数组的中位数。 说明: 中位数的定义: 中位数是排序后数组的中间值,如果有数组中有n个数,则中位数为A[(n-1)/2]。 比如:数组A=[1,2,3]的中位数是2,数组A=[1,19]的中位数是1。 样例: 持续进入数组的数的列表为:[1, 2, 3, 4, 5],则返回[1, 1, 2, 2, 3] 持续进入数组的数原创 2017-07-03 09:43:36 · 248 阅读 · 0 评论 -
最近公共祖先-LintCode
给定一棵二叉树,找到两个节点的最近公共父节点(LCA)。 最近公共祖先是两个节点的公共的祖先节点且具有最大深度。 对于下面这棵二叉树: LCA(3, 5) = 4 LCA(5, 6) = 7 LCA(6, 7) = 7#ifndef C88_H#define C88_H#include<iostream>#include<vector>using namespace std;原创 2017-07-06 08:47:01 · 259 阅读 · 0 评论 -
分割回文串 II-LintCode
给定一个字符串s,将s分割成一些子串,使每个子串都是回文。 返回s符合要求的的最少分割次数。样例 比如,给出字符串s = “aab”, 返回 1, 因为进行一次分割可以将字符串s分割成[“aa”,”b”]这样两个回文子串思想:动态规划 令len 字符串的长度,并开辟新的数组nums[len],其中nums[i]表示从0到位置i表示的字符串,它的最小切割数。初始化val[i]=i,表...原创 2017-07-14 10:05:05 · 664 阅读 · 0 评论 -
数字三角形-LintCode
给定一个数字三角形,找到从顶部到底部的最小路径和。每一步可以移动到下面一行的相邻数字上。 样例 比如,给出下列数字三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 从顶到底部的最小路径和为11 ( 2 + 3 + 5 + 1 = 11)。#ifndef C109_H#define C109_H#include&...原创 2017-07-14 10:57:16 · 281 阅读 · 0 评论 -
k数和-LintCode
给定n个不同的正整数,整数k(k < = n)以及一个目标数字。 在这n个数里面找出K个数,使得这K个数的和等于目标数字,求问有多少种方案? 样例: 给出[1,2,3,4],k=2, target=5,[1,4] and [2,3]是2个符合要求的方案 思路:动态规划#ifndef C89_H#define C89_H#include<vector>#include<iostream原创 2017-07-06 09:33:05 · 156 阅读 · 0 评论 -
k数和 II-LintCode
给定n个不同的正整数,整数k(1<= k <= n)以及一个目标数字。 在这n个数里面找出K个数,使得这K个数的和等于目标数字,你需要找出所有满足要求的方案。样例: 给出[1,2,3,4],k=2, target=5,返回 [[1,4],[2,3]]思路: 利用递归,不断剔除A[0],并在数组A中寻找满足k-1个数和为target-A[0]的方案。#ifnde...原创 2017-07-06 19:42:02 · 199 阅读 · 0 评论 -
最小调整代价-LintCode
给一个整数数组,调整每个数的大小,使得相邻的两个数的差小于一个给定的整数target,调整每个数的代价为调整前后的差的绝对值,求调整代价之和最小是多少。 样例: 对于数组[1, 4, 2, 3]和target=1,最小的调整方案是调整为[2, 3, 2, 3],调整代价之和是2。返回2。 思想:动态规划#ifndef C91_H#define C91_H#include<i...原创 2017-07-06 21:17:38 · 222 阅读 · 0 评论 -
平衡二叉树-LintCode
给定一个二叉树,确定它是高度平衡的。对于这个问题,一棵高度平衡的二叉树的定义是:一棵二叉树中每个节点的两个子树的深度相差不会超过1。 样例: 给出二叉树 A={3,9,20,#,#,15,7}, B={3,#,20,15,7} #ifndef C93_H#define C93_H#include<iostream>#include<algorithm>using namespace转载 2017-07-07 10:23:45 · 253 阅读 · 0 评论 -
二叉树中的最大路径和-LintCode
给出一棵二叉树,寻找一条路径使其路径和最大,路径可以在任一节点中开始和结束(路径和为两个节点之间所在路径上的节点权值之和) 样例 给出一棵二叉树: 1 / \ 2 3返回 6思路 利用递归,考虑两种情况的值:第一种结点node的左右结点都在路径上,此时路径和包括node结点及其左右子树的值;第二种情况node结点的左子树或者右子树在路径上,此时路径和包括node结...原创 2017-07-07 11:20:35 · 329 阅读 · 0 评论 -
直方图最大矩形覆盖-LintCode
Given n non-negative integers representing the histogram’s bar height where the width of each bar is 1, find the area of largest rectangle in the histogram. Above is a histogram where width of each ba原创 2017-07-20 09:42:20 · 302 阅读 · 0 评论