Leetcode 第一遍刷完】的更多相关文章

2014/10/15 Leetcode第一刷总算结束,时间拖太长了,希望第二遍能快一点,争取一个月能刷完第二遍??哈哈哈哈…
leetcode 第一天 2017年12月24日 第一次刷leetcode真的是好慢啊,三道题用了三个小时,而且都是简单题. 数组 1.(674)Longest Continuous Increasing Subsequence JAVA class Solution { public int findLengthOfLCIS(int[] nums) { int tem = 1 , length = 1; if(nums.length==0) return 0; for (int i = 0;i…
当有反复元素的时候呢? 不用拍脑袋都会想到一种方法,也是全部有反复元素时的通用处理方法,维护一个set,假设这个元素没增加过就增加,增加过了的忽略掉.可是,在这道题上这个通用方法竟然超时了! 怎么办?想一下为什么会这样,如果我们要排列的数字是1111112,当当前的排列中没有1时,取哪个1生成一遍,都是一样的.仅仅有当前面的1都用过了,必须轮到这个1出场的时候,它才会有价值.更明白一点说,如果我们要在生成的排列中放两个1,那么这两个1是原来的哪两个根本无所谓,不断的选,终于的结果肯定一样,可是当…
看到这个题我就伤心啊,去微软面试的时候,第一个面试官让我做的题目就是实现集合的交操作,这个集合中的元素就像这里的interval一样.是一段一段的.当时写的那叫一个慘不忍睹.最后果然被拒掉了. .好好练习算法,争取正式招聘的时候拒一次微软.哈哈~ 说归说,这道题事实上还是比較简单的.先考虑什么样子的集合是能够合并的.设两段集合是[a, b]和[c, d],不失一般性的,如果a<c,那么有以下几种情况: 1. b<c,这说明两段是全然不相交的,没办法合并. 2. b>=c&&…
第一题:题目内容 Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution, and you may not use the same element twice. Example: Given nums = [2, 7…
第一题 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元素在答案里不能重复出现. 你可以按任意顺序返回答案. 实例1. 输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] . 实例2 输入:nums = [3,2,4], targ…
这个题乍一看非常easy,实际上还挺有技巧的.我最開始的想法是找一个特殊值标记.遇到一个0,把他所相应的行列中非零的元素标记成这个特殊值.0值保持不变,然后再从头遍历一次,碰到特殊值就转化成0. 问题是这个特殊值怎么确定,题目中没有把取值范围给出,我怀着侥幸的心理用了最大和最小的int,都被揪了出来..假设找一个不存在于数组中的值,这个复杂度太高了. 有没有其它更好的方法呢?当然有.这个思想非常巧妙,最后的结果是把所有0所在的行列都化成0,换句话说.化成0这个事情仅仅要标记出是哪一行以及哪一列就…
非常难的问题,数组线性时间. 属于我之前说的解法的借助辅助空间.给定两个柱子,他们之间的面积由什么确定呢?没错,他们之间的距离和他们之间最矮的那个柱子的高度.我们并不知道这个柱子在什么位置,所以仅仅能遍历,这个复杂度就上去了.那有没有一个方法避免找中间小柱子呢?先想什么情况下不用找.除非你知道枚举出两个位置之间的柱子都比方今这个长.所以想到了用一个栈来保存较长的那些柱子编号.须要保证的一件事是栈里面的柱子高度一定是递增的,每次计算面积的时候是从当前位置往前计算的,计算一次弹出一次,每次都使用栈顶…
很自然的推广,假设去掉全然二叉树的条件呢?由于这个条件不是关键,因此不会影响整体的思路.做法依旧是每次找到一层的起点,然后一层一层的走. 假设是全然二叉树的话,每层的起点就是上一层起点的左孩子,兄弟之间的链接也简单,直接找相应父亲的左右孩子就可以. 一般二叉树时,起点应该是上一层第一个有孩子节点的左孩子,或者没有左孩子时.是他的右孩子. 为了能在孩子层中不断链接,我们必须保存当孩子层的前一个节点,当当前层找到一个节点有孩子,就接到这个pre节点后面,然后更新pre节点的指向. class Sol…
JSP 客户端发出Request请求,JSP容器将JSP转译为Servlet的源码,再编译加载到内存执行,结果Response到客户端. Request->JSP->Servlet(java)->class(.class)->Servlet instance->Response 页头第一行 <%@page import="com.xxx.xxx.类"%> <%@ page language="java" content…
如果一本书看一遍就能看懂,说明书对自己相对容易,没有必要在去看第二遍,但是对于大多数书籍,都有自己陌生的知识,看完一遍无法理解的地方,说明就是自己知识点最薄弱的,最需要去理解的地方,一旦自己理解了这些地方,自己将会有很大的进步.每本书对每个人而言是不同,每个人知识水平,理解程度不同,看待问题也就不会相同.在读第二遍的时候,自己要仔细推敲,仔细推到,仔细理解.…
八皇后问题应该是回溯法的教学典范.在本科的时候,有一门课叫面向对象.最后的附录有这个问题的源码.当时根本不懂编程,照抄下来,执行一下出了结果都非常开心,哎. 皇后们的限制条件是不能同行同列,也不能同对角线. 那么显然每一列上都要有一个皇后,仅仅须要用一个一维数组记录皇后在每一行上的位置就能够了. 算法的思想是:从第一行開始,尝试把皇后放到某一列上,能够用一个vis数组保存已经有皇后的列,当找到一个还没有皇后的列时,就尝试着把当前皇后放上,然后看看有没有之前放好的皇后跟这个皇后同对角线,假设同对角…
说到格雷码,应该没人不知道,详细它有什么用,我还真不是非常清楚,我室友应该是专家.生成的规律不是非常明显,之前看到帖子讲的,这会儿找找不到了.. 思想是这种,假设有n位,在第2^(n-1)个编码以下画一条水平线的话,你会发现除了第一位之外,其它位都是关于这条线对称的,例如以下,以三位格雷码举例: 000 001 011 010 --------------------- 110 111 101 100 非常奇妙吧,我曾经是不知道这个规律的.从一開始的一位格雷码,0,1,開始,每次对称的在上一个前…
啊啊啊啊.好怀念这样的用递归保存路径然后打印出来的题目啊.好久没遇到了. 分了两种,一种是能够反复使用数组中数字的,一种是每一个数字仅仅能用一次的.事实上没有多大差别,第一种每次进入递归的时候都要从头開始尝试.另外一种要找一个标记的数组,把已经用到过的排除掉,就像生成全排列时的做法一样. 跟我一样用引用保存中间结果的话.要注意回退的情况. 另外一种回退时,要把用到的那个数也恢复为可用,就全然像全排列时做的一样.破例贴两个题的代码.由于他们是在是不值得用两片文章来写. class Solution…
Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution, and you may not use the same element twice. 英文不好,简单翻译一下,能自己翻译的跳过,看不懂我的翻译自行结合翻译网站…
这道题之前一直没敢做,没想到前天用递归一遍过了. . 当时为什么想着用递归,而不是dp呢.由于我想到达某个位置的情况有非常多,即使从当前位置開始的搜索是已知的,但之前的状态是如何的也无从得知啊,实话实说,我是不会用dp解这个.. 递归的思路就好说多了,从当前点開始.有上下左右四个位置能够探測,假设探測成功的话,要把当前的位置用其它符号标记出来,以免反复訪问.实际上就是DFS嘛.仅仅只是入口多一些. 须要注意的一点是,每一个点都能够作为起点.所以这个要穷举一下.否则会漏掉情况的. 当然有一种情况走…
这道题还是挺难的,属于我前面提到的,给个数组,线性时间找出个什么东西,尽管上面的两个买卖股票也是这类.只是相比之下稚嫩多了.有关至少至多的问题比較烦人,不好想,等再做一些题,可能会发现什么规律.这道题的情况还是比較少的,要么买卖了两次.要么一次. 买卖一次的情况,已经解决过了,如今分析买卖两次的情况. 两次买卖之间是没有交叉的,即下一次买之前一定已经卖掉了.最easy想到,穷去分点,每一个部分都依照买卖一次的方法做. 好,恭喜.你已经走在超时的路上了.那么怎么办呢.有没有一种方法,在线性时间内,…
旋转数组的查找问题.从头開始扫一遍.O(N)的复杂度,一般也能过,甚至先排序下面,再二分都能过.只是这道题的目的当然不在于此. 想一下旋转之后对我们的查找产生了什么影响.假设没旋转过,我们直接比較target与A[middle]的大小,然后总能很确定的丢掉源数组的一半.即把搜索空间减半,可是旋转之后,仅仅依据A[middle]是确定不了下一轮的走向的,由于即使A[middle]比target大,按理说我们应该往前找,可是假设源数组是循环左移的.较小的数可能在后半部分. 上面说的都是旋转之后与没旋…
虽然题目简单,但我这好不容易优化到前2%,感觉也值得分享给大家(方法比较偷机) 题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例: 来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/two-sum著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明出处. 给定 num…
水题. 描写叙述的还挺麻烦的,实际上就是纸老虎,用两个string,一个存上一轮的结果,一个用来更新出这一轮的结果,每次扫描上一轮,统计一个字符出现的次数,然后把这个次数和字符增加到这一轮的字符串中就能够了. class Solution { public: string countAndSay(int n) { if(n == 0) return ""; string tpres, res = "1"; for(int i=1;i<n;i++){ int j…
这个题事实上非常easy的,我一開始想复杂了,它没要求记录路径,事实上仅仅要看一下每一步之后所能延伸到的最远的位置就能够了,在这一个最远位置前面的那些位置,都是能够到达的,假设扫到了某个i,它大于当前能延伸到到的最远位置,说明这个i不可达.终于的位置能不能到达,就看终于延伸到的位置能不能大于等于它. class Solution { public: bool canJump(int A[], int n) { if(n == 0) return false; if(n == 1) return…
Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that…
非常easy的一道DP,看到空间限制是O(N)的,不要习惯性的以为是要保存每一行的最小值,不难想到是要保存一行其中各个数为路径终点时的和的大小.当算到最后一行时,就是从顶部究竟部以这个底部位置为终点的最短路径和,找一个最小的就能够了. 实现的时候要注意个问题,由于计算时要用到上一行的数据,所以为了避免数据被覆盖,应该从后往前算,这个技巧用的非常多,相信大家都非常熟悉. ac代码例如以下: class Solution { public: int minimumTotal(vector<vecto…
有了上面的教训,这道题就简单多了,什么时候该更新pre是明白的了,倒是有个细节,二叉搜索树中是不同意有相等节点的,所以题目的要求用黑体字标明了.写的时候注意就能够了. class Solution { public: TreeNode *pre = NULL; bool isValidBST(TreeNode *root) { if(root == NULL) return true; bool res = true; if(root->left) res &= isValidBST(roo…
有关这样的字符串的题真是层出不穷啊,并且他们都有这样一个特点,就是递归的思路如此简单,但一定超时! 这个时候,dp就朝我们缓缓走来.递归超,dp搞!这道题的状态转移方程还是比較好写的,用ispart[i][j]代表s1贡献i长,s2贡献j长时,能不能形成s3的前i+j个字符.更新能够依照行或者列開始,s3的前i+j个字符,能够是((i-1)+1)+j构成,也能够是i+((j-1)+1)构成,这取决于当前的这个字符s3[i+j-1]跟s1[i-1]和s2[j-1]是否相等,或的关系就能够解决这个问…
构造方式跟中序与后序全然一样,并且一般都习惯正着来,所以更简单. 代码是之前写的,没实用库函数,不应该. TreeNode *buildIt(vector<int> &preorder, int start1, vector<int> &inorder, int start2, int len){ if(len <= 0) return NULL; TreeNode *root = new TreeNode(preorder[start1]); int i =…
这道题非常难. 之前的题目我提到过一次用两个vector来做层序遍历的,就是由于这道题.要想最后恢复出单词变换的路径,就须要事先保存,依据dp中路径恢复的启示,保存的应该是一个单词的前一个变换节点.可能有非常多个单词都能变换到当前单词,因此应该是一个set.用一个二维的vector保存当前能够变换到的单词和变换出这些单词单词.每一维的vector存放的都是一个set.设存放当前可訪问单词的vector下标是current,存放变幻出这些单词的vector下标是pre,那么每一轮要開始更新curr…
这道题是为数不多的感觉在读本科的时候见过的问题. 人工构造的过程是如何呢.兴许遍历最后一个节点一定是整棵树的根节点.从中序遍历中查找到这个元素,就能够把树分为两颗子树,这个元素左側的递归构造左子树,右側的递归构造右子树.元素本身分配空间,作为根节点. 于set和map容器不同的是.vector容器不含find的成员函数.应该用stl的库函数,好在返回的也是迭代器,而vector的迭代器之间是能够做减法的.偏移量非常方便的得到. TreeNode *buildRec(vector<int> &a…
在更新上面一道题的时候我就想,是不是另一道打印路径的,果不其然啊. 这样的题非经常见的,做法也非常easy,我是用一个引用的vector来存,满足条件之后直接压入结果集中,当然也能够用数组之类的,都一样.用引用须要注意的问题就是递归进行到后面的时候会对栈中的上层状态产生影响,当然能够用传值的方法来避免这个问题,可是那样子开销太大了(每次船建和销毁一个类对象,不是明智的选择).那么就是要回退,那什么时候回退,回退多少次呢?我觉得能够这样确定,在一层递归中,压入和弹出要成对出现,在这种方法中压入了几…
这个题比刚才那个更难. 假设没做过上一个,这个简直是无情. 先想一个笨笨的解法,如何确定一个矩形呢?找一个左上角,然后每行的看能延伸到什么位置.注意随着行数的添加,列数是仅仅能变短,不能变长. 想一下也知道这样的方法的复杂度有多高.超时无疑. 假设刚好做了这个求柱形的题目.会不会收到启示呢.将矩阵中的每个1都看做是一个小的正方形.在每一列,连续的1就构成了一个柱体.求一连串这种柱体围成的最大面积就是全部1构成的最大矩形,问题被完美转化. 尽管在我看来.这种转化是非常不easy的,要不是这两个题目…