leetCode_Hard
文章平均质量分 64
码农Crystal
Life is a box of chocolates you never know what you're going to get
展开
-
【无聊刷题】leetCode之解数独
题意:解数独,空缺的方格用.表示。解法:就是典型的回溯法,用row[i][j],column[i][j],grid[i][j]表示i行,i列,i格j是否用。用flag表示当前是否有解。若有解,则不用再递归下去。可能是leetCode里Hard的题目当中最简单的一题了。代码:class Solution {public: int row[9][10]; int colu原创 2016-08-29 09:40:18 · 1463 阅读 · 0 评论 -
leetCode_Word BreakII
题意:给定一个字符串和一个单词序列,判断该字符串能不能分成若干个子串,且每个子串是单词序列的词。给出所有分法。解法:分为两个步骤:首先判断是否能分,然后再给出所有的分法。判断是否能分:从后向前扫描,如果从某一位置到字符串的结尾在单词序列里,或者某一序列在单词序列并且这一序列的下一个字母已经被验证能分,则isOk[i]=true,只要判断isOk[0]是否为true就可以。给出所有分法:原创 2016-09-22 14:39:26 · 269 阅读 · 0 评论 -
【leetCode】Shortest Palindrome
题意:给定一个字符串,在字符串的前面加一些字符,使之成为回文串。返回最短长度的回文串。解法:一开始看成在字符的每个字母前都可以加了,我说怎么做不出来,看解法有感觉跟我理解的不一样,还以为是解法错了,没想到是我错了。思路就是看看字符串从0开始最长的回文串是多少,假设s[0~i]是以s[0]开头的最长的回文串,那么要加的字符串为s[i+1~l]的逆序。问题就转换为如何去发现从s[0]开始的最长原创 2016-10-22 11:00:18 · 302 阅读 · 0 评论 -
leetCode_Palindrome Pairs
题意:给定一系列单词,若某两个单词拼接起来是回文串,则把这两个单词下标组成的二元组成为“回文对”,找出所有的回文对。方法:其实很简单,对于任意两个单词a,b,假设b的长度大于a。则a+b是回文串的条件是字符串b从最后一位到前面某一位反转字符串是a并且b串中该位置到第一位是回文串,若b+a是回文串的条件是字符串b从第一位开始到某一位反转的字符串是a并且b串中该位置到最后一位的串是回文串。所以对于原创 2016-10-23 11:34:39 · 410 阅读 · 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 · 359 阅读 · 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 · 264 阅读 · 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 · 353 阅读 · 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 · 311 阅读 · 0 评论 -
【leetCode】Find Median from Data Stream
题意:设计一个数据结构,支持两个操作:插入数和找出该序列的中位数。也就是在一个不断增加的序列中找出中位数。思路:用两个堆,一个大顶堆,一个小顶堆。每当来一个数时,如果这个数小于大顶堆的最大值,则插入大顶堆,否则插入小顶堆。如果这两个堆的大小不一样,则调配一下(偶数个数时两个堆的大小相等,奇数个数时大顶堆的大小-1=小顶堆)。中位数操作,对于奇数时,则是大顶堆的最大值,否则则是大顶堆的最大值加上原创 2016-10-27 09:11:15 · 365 阅读 · 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 · 336 阅读 · 0 评论 -
【leetCode】Sliding Window Maximum
题意:给定一个数组num和一个数k,返回num0..k-1,num1,k...的最大值思路:题目提示说要用双端队列,我的想法如下:用两个双端队列,一个记录数,一个记录下标,如果这个数比当前的队头大,就从前面插,否则就跟插入排序类似,从队尾弹出比他小的元素后,把他插进去,再把那些元素放回来。每次最大值都是队头元素,如果队头元素太老了,就弹出来。其实我这个答案跟正确答案很接近,但是我忽原创 2016-10-29 12:45:01 · 319 阅读 · 0 评论 -
【leetCode】Largest Rectangle in Histogram&Maximal Rectangle
因为leetCode 的85题是84题的变种,所以合成一个博客写。84题的题意:一个直方图中,每个矩阵都是宽为1,高度不同。求在这个直方图里能画出矩形的最大面积思路:先从前到后,再从后到前,重复如下过程:用一个栈,先入第一个元素,,如果后一个元素的高度比栈顶低,则加上该数对应的宽度并弹出该元素。一直重复完。代码如下:int largestRectangleArea(vector原创 2016-10-30 16:45:43 · 265 阅读 · 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 · 273 阅读 · 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 · 323 阅读 · 0 评论 -
[leetcode]Count of Range Sum
题意:给定一个数组,判断连续子数组的和在某个区间的个数首先用sum数组存储前n个的和。然后有两种方法方法一:二叉搜索树。把前面的数组元素放到二叉搜索树上,然后中序遍历,如果该元素-某个元素小于下边界直接返回方法二:线段树。非叶子节点代表范围内的节点个数。从后往前更新即可。第二种的代码在:http://blog.csdn.net/murmured/article/details/50原创 2016-11-11 17:05:35 · 357 阅读 · 0 评论 -
[leetCode] Expression Add Operators
题意:给定只有0-9组成的字符串,在字符串加上二元+-*使之成为一个算式,其结果等于指定的一个数思路1:首先枚举组成算式,再用栈进行计算。但是在栈的时间耗费太长,超时思路2:这个是我从网上找的。递归加运算符号。用cur表示当前值,用diff表示变化值,这个思路比较巧妙,+和-的diff和cur比较好理解。*的不太好理解,多理解就发现巧妙之处了,上代码。class Solution {原创 2016-11-11 20:25:27 · 357 阅读 · 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 · 348 阅读 · 0 评论 -
【leetCode】Text Justification
题意:给定一组单词序列和一个最大的单词长度,要求按行显示单词,单词之间有空格,每行的最大长度不能超过给定值。对于非末行,空格的长度均匀分配,对于末行,左对齐显示,即单词之间只能有一个空格,剩余的空格在最后一个单词之后。思路:没什么特别的,纯模拟题。代码:vector fullJustify(vector& words, int maxWidth){ vector length原创 2016-09-21 11:32:56 · 250 阅读 · 0 评论 -
leetCode_Minimum Window Substring
题意:给定字符串s和t,返回s中包含t所有字符的长度最短的子串例子:如s="ADOBECODEBANC",t="ABC",返回"BANC";解法:用letters记录t中每个字符的出现个数,用一个队列记录s中的那些在t出现的下标,用cur记录s中t字符串里的字符出现个数,用count表示满足了t中的多少个字符。也就是说,若s[i]在t出现,并且cur[s[i]]string minWi原创 2016-09-08 09:54:20 · 339 阅读 · 0 评论 -
leetCode_Recover Binary Search Tree
题意:给定一个二叉搜索树,其中有两个元素的顺序被对调了,请找出这两个元素思路:用pre节点代表前一个被遍历的节点,root节点代表当前被遍历的节点,如果pre->val>root->val则顺序有问题。如果出现1次,则把这两个元素的值交换;如果出现两次,则把第一次的pre和第二次的root值交换。其他到没啥,主要想清楚pre节点的记录方法。代码:/** * Definition原创 2016-09-09 15:34:22 · 281 阅读 · 0 评论 -
leetCode_分组反转链表
题意:给一个链表及一个数k,每k个节点一组反转链表。例如:链表1->2->3->4->5以及k=2,返回的链表为2->1->4->3->5。解法:反转链表比较熟(可是今天还写错过1次)先确定start和end,previous先定位为start,end定位为previous->next,然后while(previous!=end) { start->next=start->next->next原创 2016-09-01 10:00:50 · 670 阅读 · 0 评论 -
leetCode_Binary Tree Maximum Path Sum
原题:给定一棵二叉树,每个节点有一个数字代表路径值。找出最长路径。(路径不必穿过树根)解法:先找以各个节点作为子树的最长路径(路径必须经过根)。要么就是根到左子树的某个节点,要么就是根到右子树的某个节点,要么就是穿过根(从左到右),要么就是根节点本身。用ans维护最长路径,用findPath表示不穿过根的路径最大值(向上返回用)。代码如下:/** * Definition for a b原创 2016-09-13 14:11:35 · 419 阅读 · 0 评论 -
leetCode_First Missing Positive
题意:给定一个数组,找出未出现最小的正数思路:先找到正数中的最小值。如果大于1,则直接返回1。 否则,我们知道1应该放在a[0],2应该放在a[1],依次类推。所以遍历数组,当某个数不在该有的位置上时,交换到应在的位置上。要注意一趟不能保证完成,如(3,4,-1,1),一趟交换的结果是(-1,1,3,4),必须得多次才行。代码如下:(思路是参考网上的。。。)原创 2016-09-13 14:17:37 · 277 阅读 · 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 · 276 阅读 · 0 评论 -
leetCode_Trapping Rain Water
题意:给定n个非负数代表每个柱子的高度,宽度均为1。问能在空间里放多少水。解法:设定previous与next,然后移动next,找到第一个比prevoius高的或者比prevoius低的柱子当中最高的。然后两者较低的乘以宽度-所有柱子的高度之和即为prevoius,next之间的蓄水量。然后让prevoius=next,依次循环。挺虐的,做了小半天才AC。代码:int trap(ve原创 2016-09-03 09:30:48 · 281 阅读 · 0 评论 -
LC之45Jump Game II
从今天开始做leetCode难度为Hard部分的题目,剩下难度为Medium的题目等到以后再做,先暂停一会儿~,所以博客的标题的格式和标签都改了~题意:给定一个数组,每一个数组的数字代表你能最多跳几步。从起点开始,问最少跳几次能到终点?思路:贪心问题。从起点开始,起点跳能到哪一步已知。但是未必要跳到0+num[0]步。因为在(1,num[0])可能会有某一步,从那儿开始跳下一步会跳的更远。原创 2016-08-24 15:28:35 · 349 阅读 · 0 评论 -
leetCode_Distinct Subsequences
题意:给定两个字符串s和t,问只通过删除字符的方法将s变为t有多少种方法解法:本题是典型的动态规划,给出两种解法(第一种是我自己的比较烦琐,第二种是网上的思路比较清楚)。就算是思路较烦琐,也是我想的,我觉得这是我独立做出了的第一道dp题,开心~。解法一:用ans[i][j]表示以s[i]结尾能到t[j]有多少种方法。则对于ans[i][0],只要把s里面的所有等于t[0]的下标设置成1即可原创 2016-09-05 10:38:48 · 270 阅读 · 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 · 273 阅读 · 0 评论 -
【经典题】leetCode_InsertInterval
题意:一个由(a,b)(a、b均为整数)构成的二元组序列,并且序列与序列中间不重叠。插入一个新的二元组之后,给出插入之后不重叠的序列解法:设新的二元组为(an,bn)在原序列中找到第一个二元组w,满足w.abn,合并中间的即可。上代码/** * Definition for an interval. * struct Interval { * int start; *原创 2016-08-26 14:05:36 · 531 阅读 · 0 评论 -
leetCode_Longest Valid Parentheses
题意:给定一段由“(”和“)”组成的序列,给出最长括号匹配序列的长度。解答:动态规划+分类讨论,用ans[i]表示以i开始的最长括号匹配序列的长度。分以下几种情况。情况1:如果s[i]==‘)’,显然是0,不用讨论。情况2:如果s[i]=='(',分如下几种情况: 如果s[i+1]==')',则ans[i]=2; 如果s[i+1]=='('并且s[i+1原创 2016-09-06 10:00:24 · 287 阅读 · 0 评论 -
leetCode_Valid Number
题意:给定一个字符串,判断这个字符串是不是合法的数字解法:很明显用状态图。值得注意的是:3.、.7、0003都算合法,科学计数法之后只能有整数。上状态图:代码如下:bool isNumber(string s){ int i,state=0,length=s.length()-1; for(; length>=0&&s[length]==' '; length原创 2016-09-06 11:40:15 · 238 阅读 · 0 评论 -
leetCode_Longest Consecutive Sequence
题意:在一串数组中,找出最长的连续序列(元素间的相对位置可以变化)解法:这是一题变形的DFS。先用map把所有的数字(key)和是否出现(value)存起来,然后对于每一个元素,递增找出出现的元素,再递减找出出现的元素,每一次找到某个元素,让它的key为0既可。代码:class Solution {public: int longestConsecutive(vector&原创 2016-09-20 10:11:35 · 342 阅读 · 0 评论 -
leetCode_Substring with Concatenation of All Words
题意:给定一个字符串s和一个组等长的单词序列t,返回子串的开始坐标,子串为单词序列中所有单词的连接(只出现一次),顺序不重要。例如:s="barfoothefoobarman" words:["foo","bar"] 返回的字典序列[0,9]思路:非常简单,用map记录单词序列出现的次数,然后从每个index开始,看看t.size()*t[0].length()这个区间内是否把t所有的单词原创 2016-09-07 12:52:27 · 228 阅读 · 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 · 412 阅读 · 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 · 214 阅读 · 0 评论 -
【leetCode】Word Search II
题意:给定一组二维小写字母数组和一组单词序列,问单词序列里有多少个单词能从二维数组某个点开始,上下左右移动形成?思路:单词序列用Trie树压缩,然后从树根开始,在二维数组里找单词即可。Trie树很好理解,适合于前缀重叠的情况。代码:class Solution {public: struct Node{ int end; Node *next[原创 2016-11-02 21:31:05 · 333 阅读 · 0 评论