leetCode
文章平均质量分 58
码农Crystal
Life is a box of chocolates you never know what you're going to get
展开
-
【leetCode】Word Search II
题意:给定一组二维小写字母数组和一组单词序列,问单词序列里有多少个单词能从二维数组某个点开始,上下左右移动形成?思路:单词序列用Trie树压缩,然后从树根开始,在二维数组里找单词即可。Trie树很好理解,适合于前缀重叠的情况。代码:class Solution {public: struct Node{ int end; Node *next[原创 2016-11-02 21:31:05 · 309 阅读 · 0 评论 -
【leetCode】Shortest Palindrome
题意:给定一个字符串,在字符串的前面加一些字符,使之成为回文串。返回最短长度的回文串。解法:一开始看成在字符的每个字母前都可以加了,我说怎么做不出来,看解法有感觉跟我理解的不一样,还以为是解法错了,没想到是我错了。思路就是看看字符串从0开始最长的回文串是多少,假设s[0~i]是以s[0]开头的最长的回文串,那么要加的字符串为s[i+1~l]的逆序。问题就转换为如何去发现从s[0]开始的最长原创 2016-10-22 11:00:18 · 287 阅读 · 0 评论 -
leetCode_Word BreakII
题意:给定一个字符串和一个单词序列,判断该字符串能不能分成若干个子串,且每个子串是单词序列的词。给出所有分法。解法:分为两个步骤:首先判断是否能分,然后再给出所有的分法。判断是否能分:从后向前扫描,如果从某一位置到字符串的结尾在单词序列里,或者某一序列在单词序列并且这一序列的下一个字母已经被验证能分,则isOk[i]=true,只要判断isOk[0]是否为true就可以。给出所有分法:原创 2016-09-22 14:39:26 · 253 阅读 · 0 评论 -
【leetCode】Text Justification
题意:给定一组单词序列和一个最大的单词长度,要求按行显示单词,单词之间有空格,每行的最大长度不能超过给定值。对于非末行,空格的长度均匀分配,对于末行,左对齐显示,即单词之间只能有一个空格,剩余的空格在最后一个单词之后。思路:没什么特别的,纯模拟题。代码:vector fullJustify(vector& words, int maxWidth){ vector length原创 2016-09-21 11:32:56 · 230 阅读 · 0 评论 -
Copy List with Random Pointer -- LeetCode
http://blog.csdn.net/linhuanmars/article/details/22463599Random的思路:思路一:我的思路,用Vector存下所有节点,一个一个比对思路二:用map存下位置相同的结点,newNode->random=map.get(OldNode->random)思路三:不用辅助空间的方法,见图。转载 2016-09-20 15:02:09 · 200 阅读 · 0 评论 -
leetCode_发现两排好序数组的中位数
double findKth(int a[], int m, int b[], int n, int k) { //always assume that m is equal or smaller than n if (m > n) return findKth(b, n, a, m, k); if (m == 0)原创 2016-09-23 10:16:40 · 398 阅读 · 0 评论 -
leetCode_Longest Consecutive Sequence
题意:在一串数组中,找出最长的连续序列(元素间的相对位置可以变化)解法:这是一题变形的DFS。先用map把所有的数字(key)和是否出现(value)存起来,然后对于每一个元素,递增找出出现的元素,再递减找出出现的元素,每一次找到某个元素,让它的key为0既可。代码:class Solution {public: int longestConsecutive(vector&原创 2016-09-20 10:11:35 · 316 阅读 · 0 评论 -
leetCode_Clone Graph
题意:克隆一个用邻接矩阵表示的无向图。无向图的数据结构以及函数原型如下:/** * Definition for undirected graph. * struct UndirectedGraphNode { * int label; * vector neighbors; * UndirectedGraphNode(int x) : label(x) {}原创 2016-08-14 14:02:39 · 203 阅读 · 0 评论 -
leetCode_Lowest Common Ancestor of a Binary Tree
题意:找出一个二叉树两个节点的公共祖先方法一:给两个节点编号,0表示左子树,1表示右子树。编完号之后找出最长前缀,从根往节点找即可。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; *原创 2016-09-17 20:24:01 · 243 阅读 · 0 评论 -
【leetCode】Maximum Gap
题意:给定一个数组,返回排序之后的相邻元素差的最大值。在o(n)的时间和空间复杂度完成思路:二进制的拓扑排序。两个桶,一个是0,一个是1,从低位开始排,32次(一个月前给小孩子讲过)代码如下: int maximumGap(vector& nums) { vector zeroes; vector ones; int i,j,k,s原创 2016-09-17 14:33:53 · 250 阅读 · 0 评论 -
leetCode_Word Break
题意:给定一个单词和一个单词序列,看看这个单词能不能分割成一系列单词,并且分割后的单词都在单词序列当中解法:很简单的dp,用s[0...word.length]表示到第几位能否分割。若word.substring(0,i+1)在这个单词里或者s[j]=true并且word.substring(j+1,i+1)在这个单词序列里,则s[i]=true。最后返回的值为s[word.length-1]原创 2016-08-14 10:57:05 · 326 阅读 · 0 评论 -
leetCode_Candy
题意:N位小朋友站成一行,每个小朋友有一个分值。你给这N位小朋友发糖果,必须满足以下要求:1、每个小朋友至少有一个糖果2、分值高的比邻居分值低的糖果数多。求最少糖果数。我的思路:把这一列小朋友分成多个邻居分值不一样的段。比如(1,2,3,3)分成(1,2,3)和(3)两段。然后再找出每个段单调的终点,如果是单调上升就从第一个点一次往后增1,如果是单调下降就从最后一个点往前增1,先上升再原创 2016-09-16 20:12:07 · 279 阅读 · 0 评论 -
leetCode_Palindrome Partitioning II
题意:给定一个字符串,要把他这个字符串分成若干个回文子串。问数目最小是多少。题解:动态规划。用ans[j]表示以j结尾的回文子串数量,则如果s(0,j)是回文串,则ans[j]=1,否则 ans[j]=min(ans[i-1])+1,并且s(i,j)是回文串。代码:int minCut(string s){ int i,j,k,l=s.length(),left,right;原创 2016-09-14 10:47:11 · 252 阅读 · 0 评论 -
leetCode_Count Complete Tree Nodes
题意:统计完全二叉树的节点数方法:假设这个二叉树有h层,则1——h-1的每一层节点为2^(i-1)个(完全二叉树的性质)。难点就是统计最后一层的节点树。用二分查找的思想,对于倒数第二层的节点,有两个孩子的一定是在有0个/1个孩子的左边,所以最后一层的节点是有序的,查找出2个孩子与1个/0个的分界点即可。代码:int countNodes(TreeNode* root){ if原创 2016-08-23 13:54:43 · 239 阅读 · 0 评论 -
leetCode_Binary Tree Maximum Path Sum
原题:给定一棵二叉树,每个节点有一个数字代表路径值。找出最长路径。(路径不必穿过树根)解法:先找以各个节点作为子树的最长路径(路径必须经过根)。要么就是根到左子树的某个节点,要么就是根到右子树的某个节点,要么就是穿过根(从左到右),要么就是根节点本身。用ans维护最长路径,用findPath表示不穿过根的路径最大值(向上返回用)。代码如下:/** * Definition for a b原创 2016-09-13 14:11:35 · 398 阅读 · 0 评论 -
leetCode_Palindrome Pairs
题意:给定一系列单词,若某两个单词拼接起来是回文串,则把这两个单词下标组成的二元组成为“回文对”,找出所有的回文对。方法:其实很简单,对于任意两个单词a,b,假设b的长度大于a。则a+b是回文串的条件是字符串b从最后一位到前面某一位反转字符串是a并且b串中该位置到第一位是回文串,若b+a是回文串的条件是字符串b从第一位开始到某一位反转的字符串是a并且b串中该位置到最后一位的串是回文串。所以对于原创 2016-10-23 11:34:39 · 389 阅读 · 0 评论 -
leetCode_Split Array Largest Sum
题意:把一个非整数数组分成若干个子数组,使得子数组和的最大值最小题解:刚刚想起来,艾神曾经说过一看到最大值最小就得想到二分。好吧,以后区间求值都要往二分上去想,不过还是有动态规划的思路的。方法一:动态规划(n^2超时)a[s][i](表示以nums[s]结尾并且前面分成i个数组)=min(a[s][i],max(a[k][i-1],sum[s]-sum[k])),其中(i-1方法二原创 2016-10-12 20:26:10 · 361 阅读 · 0 评论 -
leetCode_Max Sum of Rectangle No Larger Than K
题意:给定一个二维整数数组,找出一个子矩形,使得该子矩形的和不超过K且和最大思路:简单的思路就是枚举起点和终点,然后每行每列sum数组,加加减减即可,显然会超时。优化的思路:枚举起点列和终点列,枚举每一行,把前面的和放在集合里,集合有lower_bound方法可以二分查找,找到合适的值即可。代码如下:class Solution {public: int maxSumSu原创 2016-11-03 16:38:11 · 346 阅读 · 0 评论 -
【leetCode】 Count of Smaller Numbers After Self
题意:给定一个数组nums,返回i坐标往后的比nums[i]小的数思路:用二叉搜索树,两个数值域:val和count,val表示nums[i]的值,count表示该节点左子树节点的数量。从后向前,如果向左,则上一层的count++,如果向右,则ans+=1+root->count,存入ans数组即可。代码如下:class Solution {public: struct No原创 2016-11-02 19:40:43 · 328 阅读 · 0 评论 -
[leetCode] Expression Add Operators
题意:给定只有0-9组成的字符串,在字符串加上二元+-*使之成为一个算式,其结果等于指定的一个数思路1:首先枚举组成算式,再用栈进行计算。但是在栈的时间耗费太长,超时思路2:这个是我从网上找的。递归加运算符号。用cur表示当前值,用diff表示变化值,这个思路比较巧妙,+和-的diff和cur比较好理解。*的不太好理解,多理解就发现巧妙之处了,上代码。class Solution {原创 2016-11-11 20:25:27 · 339 阅读 · 0 评论 -
[leetcode]Count of Range Sum
题意:给定一个数组,判断连续子数组的和在某个区间的个数首先用sum数组存储前n个的和。然后有两种方法方法一:二叉搜索树。把前面的数组元素放到二叉搜索树上,然后中序遍历,如果该元素-某个元素小于下边界直接返回方法二:线段树。非叶子节点代表范围内的节点个数。从后往前更新即可。第二种的代码在:http://blog.csdn.net/murmured/article/details/50原创 2016-11-11 17:05:35 · 338 阅读 · 0 评论 -
【leetCode】Wildcard Matching
题意:通配符匹配,有两个通配符:1、"?"匹配任意单个字母2、"*"匹配任意字母串(包括空串)思路:根据*切割成若干子串,只要从前到后能匹配即可,要注意头部、尾部和边界情况。分有没有*两种情况讨论。代码:bool isMatch(string s, string p){ if(p=="") return s==""; string t,temp="";原创 2016-10-30 21:07:17 · 309 阅读 · 0 评论 -
【leetCode】Regular Expression Matching
题意:正则表达式匹配,有个两个匹配原则:1、“.”与任何字符匹配2、"*"与零次或多次*之前的字符匹配思路:用递推的方法。.很容易对于*,看代码吧,说不清楚了bool match(string s,string p,int sl,int pl){ int k; // cout<<sl<<" "<<pl<<endl; if(s.length()==s原创 2016-10-30 21:01:52 · 256 阅读 · 0 评论 -
【leetCode】Largest Rectangle in Histogram&Maximal Rectangle
因为leetCode 的85题是84题的变种,所以合成一个博客写。84题的题意:一个直方图中,每个矩阵都是宽为1,高度不同。求在这个直方图里能画出矩形的最大面积思路:先从前到后,再从后到前,重复如下过程:用一个栈,先入第一个元素,,如果后一个元素的高度比栈顶低,则加上该数对应的宽度并弹出该元素。一直重复完。代码如下:int largestRectangleArea(vector原创 2016-10-30 16:45:43 · 244 阅读 · 0 评论 -
leetCode_Minimum Height Trees
题意:给定一个具有树性质的图(其实就是无向无环图),若把某一个节点作为树的根节点,则每个树都有一个高度。求最小高度树对应的根节点。解法:每一次遍历,把叶子节点都剪掉,留到最后的1——2个节点就是答案。代码:vector findMinHeightTrees(int n, vector>& edges){ vector du(n,0); map> e; vect原创 2016-10-08 10:51:51 · 300 阅读 · 0 评论 -
【leetCode】Sliding Window Maximum
题意:给定一个数组num和一个数k,返回num0..k-1,num1,k...的最大值思路:题目提示说要用双端队列,我的想法如下:用两个双端队列,一个记录数,一个记录下标,如果这个数比当前的队头大,就从前面插,否则就跟插入排序类似,从队尾弹出比他小的元素后,把他插进去,再把那些元素放回来。每次最大值都是队头元素,如果队头元素太老了,就弹出来。其实我这个答案跟正确答案很接近,但是我忽原创 2016-10-29 12:45:01 · 301 阅读 · 0 评论 -
leetCode_Patching Array
题意:给定一组正整数数组,要组成1——n之间的所有正整数,问最少要补充多少个数解法1:类似01背包的做法,首先看看不能组成的最小正整数啥多少,然后把这个数加进去,再重复这个步骤。很显然,时间复杂度和空间复杂度都不能满足题意,虽然这也是贪心哈。解法2:用min表示当前要找的数,i表示和数组中第几个数相比。初始化为min=1,i=0。如果min>nums[i],则min=min+nums[i]原创 2016-10-05 11:38:01 · 301 阅读 · 0 评论 -
【leetCode】Find Median from Data Stream
题意:设计一个数据结构,支持两个操作:插入数和找出该序列的中位数。也就是在一个不断增加的序列中找出中位数。思路:用两个堆,一个大顶堆,一个小顶堆。每当来一个数时,如果这个数小于大顶堆的最大值,则插入大顶堆,否则插入小顶堆。如果这两个堆的大小不一样,则调配一下(偶数个数时两个堆的大小相等,奇数个数时大顶堆的大小-1=小顶堆)。中位数操作,对于奇数时,则是大顶堆的最大值,否则则是大顶堆的最大值加上原创 2016-10-27 09:11:15 · 349 阅读 · 0 评论 -
leetCode_Number of Digit One
题意:给一个数,返回小于这个数的正整数中含1的个数解法:如果这个数小于等于0,返回0。 如果这个数大于0,我们就得按照每个位来判断。比如数字1159,个位上为1的数就有0001~1151共116个。那么如何判断呢?要根据每位的数字来定,详情见代码吧。先把去掉这个位上的数的所有数都存在一起。代码如下:int countDigitOne(int n){ vec原创 2016-09-30 17:33:35 · 293 阅读 · 0 评论 -
leetCode_Scramble String
题意:我觉得中文说不清楚了,英文题照抄了~Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrings recursively.Below is one possible representation of s1 = "great":原创 2016-11-06 19:56:35 · 338 阅读 · 0 评论 -
leetCode_Frog Jump
题意:一条河被分为k个单元,每个单元也许有石头。一个青蛙从第0个单元开始跳,第一次跳到第1个单元。后序如果他上次跳了k个单元,则下次可以跳k-1,k,k+1个单元。问青蛙能不能跳到对岸。解法:大体的思路都想到了,用set记录跳到每个石头那一跳的长度,对于每一个石头,看看能不能从它前面的某个石头跳到那个石头上。但是有个细节:用jump[i]代表这个石头最远能跳到哪儿,如果连最远都跳不到某个石头,原创 2016-10-13 16:54:26 · 320 阅读 · 0 评论 -
【leetCode】Interleaving String
题意:给定3个字符串s1,s2,s3,判断s3是否由s1和s2插入而成思路:分我的思路和网上的思路,其实本质是一样的。我的思路:用old1,old2数组表示上一个s3的字符能用s1和s2的哪些字符组成,new1,new2表示当前s3字母能由s1和s2组成,对于old数组的点对old1[i],old2[j],若s2[j+1]==s3[k],则在new的数组里push(i,j+1),同理若s1原创 2016-10-24 11:41:58 · 249 阅读 · 0 评论 -
leetCode_Recover Binary Search Tree
题意:给定一个二叉搜索树,其中有两个元素的顺序被对调了,请找出这两个元素思路:用pre节点代表前一个被遍历的节点,root节点代表当前被遍历的节点,如果pre->val>root->val则顺序有问题。如果出现1次,则把这两个元素的值交换;如果出现两次,则把第一次的pre和第二次的root值交换。其他到没啥,主要想清楚pre节点的记录方法。代码:/** * Definition原创 2016-09-09 15:34:22 · 264 阅读 · 0 评论 -
leetCode_Permutation Sequence
题意:在集合[1,2,...,n]中找出第k个组合序列思路:相当于把每个组合序列编号,从最高位开始,看看每一位能填几。代码如下:string getPermutation(int n, int k){ vector f; bool isUsed[10]; int i,j,t,m; string ans; f.push_back(1);原创 2016-08-18 09:19:56 · 224 阅读 · 0 评论 -
leetcode_House Robber III
今天本宝宝终于体验了一次什么叫记忆化搜素题意:一个房子,里面的房间构成二叉树,并且每个房间都有一定数目的宝藏,要求在不偷相邻房间的宝藏的情况下,获得最大收益class Solution {public: map zero; map one; int add(TreeNode * root ,int index) { if(root==NULL)原创 2016-05-25 14:18:13 · 248 阅读 · 0 评论 -
leetcode_Combinations(回溯模板)
题意 给定n,k,返回1到n种任意k个数的组合序列。不能重复。简直就是回溯的模板啊,直接上代码class Solution {public: int a[30]; vector> ans; vector temp; void find(int index,int num,int n,int k) { int i; if(原创 2016-05-26 09:13:52 · 326 阅读 · 0 评论 -
leetCode_Maximum Product Subarray
题意:给定一列数,找出乘积最大的子数组解法:这道题非!常!山!寨!思路很简单,用temp记录当前乘到哪儿了。如果temp为正数,则更新(由于数组都是整数所以肯定越乘越大),若temp为负数则保存当前值与第一个负数的temp相除的值。要注意若某个元素为0时,需要将temp初始化。上代码。maxVal表示第一个出现的temp为负数的值。int maxProduct(vector& nums){原创 2016-06-05 19:56:53 · 258 阅读 · 0 评论 -
Longest Substring Without Repeating Characters
题意:给定一个字符串,找出不含相同字母的连续子串思路:复杂度o(n)用一个数组used[500]记录每个字符出现的位置,用tempRes记录当前子串的长度。若出现重复,则tempRes的初始值为i-used[s[i]](就是该字母上一次出现的位置到当前位置,能保证之前的不重复)。上代码 int lengthOfLongestSubstring(string s) {原创 2016-06-02 10:07:41 · 243 阅读 · 0 评论 -
leetcode_链表转成二叉搜索树
题意:把一个排序好的链表转换成平衡二叉搜索树思路:其实跟数组那题一样。区别是建立右子树的时候,有一个trick:由于链表不能根据下标访问,所以新建一个节点的时候必然会遍历整个链表。设中间节点为middle,从head到middle的前一个为左子树,从middle->next往后为右子树 TreeNode * build(ListNode *head,int start,int end)原创 2016-06-11 10:57:30 · 611 阅读 · 0 评论 -
leetCode_Minimum Size Subarray Sum
题意:给定一个正整数数组,发现长度最短的数组满足数组的和>=s方法一: nlgn方法先累加并保存到sum数组。然后对于sum[i],在sum[i+1]到sum[length]中二分查找出一个值,满足sum[k]-sum[i]>=s&&sum[k-1]-sum[i] int minSubArrayLen(int s, vector& nums) { vector sum原创 2016-06-12 18:23:31 · 193 阅读 · 0 评论