leetcode 刷题总结
来源:互联网 发布:java dead code 编辑:程序博客网 时间:2024/05/16 13:50
21Merge Two Sorted Lists 合并两个有序链表依次添加就可以效率高一些的方法就是递归22Generate Parentheses给定一个数n,生成n对有效括号序列采用递归,从左n,右n开始,如果左大于0,则加入左括号,如果右大于0,并且左小于右,则加入右括号,当左和右均为0,则得到一个有效结果23Merge k Sorted Lists 合并K个有序链表依次两两合并会超时,解决方法是使用二分法来两两合并。使用一个升序的优先队列,将k个链表的一个结点依次放到队列中,队列弹出结点,弹出结点有next结点则next结点加入队列。直到队列为空。24Swap Nodes in Pairs 两两交换1-2-3-4=》2-1-4-3用了几个指针来标记各位置,遍历一遍交换完毕递归解决25Reverse Nodes in k-Group 26Remove Duplicates from Sorted Array移除重复元素,返回新长度遍历拷贝,效率不好j记录当前个数,如果a[j]!=a[i],则将第++j个位置赋值为a[i]27Remove Element移除等于特定值的元素,返回新长度将等于特定值的元素赋值为Integer的最大值,排序对于每一个不等于特定值的元素都重新赋值给新位置28Implement strStr() 子串第一次出现的位置如果haystack长度小于needle,则返回-1;如果haystack与needle相同,则返回0;遍历haystack,看某个位置起的子串是否与needle相同。29Divide Two Integers除法(不用乘除模)普通减法超时考虑符号问题,加减法做除法,必须是正数。
考虑边界问题。
除法考虑递归处理30Substring with Concatenation of All Words31Next Permutation下一个全排列总结规律,降序序列的前一个元素与降序序列倒数第一个比该元素大的元素交换,然后将倒数第一个元素后的元素倒置32Longest Valid Parentheses33Search in Rotated Sorted Array 二分查找,但是是旋转型有序数组34Search for a Range 在有序数组中找到某个数的范围使用二分法,先找到一个等于某数的位置,然后左右扩展,得到结果递归做法效率好像更好35Search Insert Position 在有序数组找到某数的插入位置二分查找,直到start>end,结束循环,返回start36Valid Sudoku有效数独的验证横向验证,纵向验证,3*3验证,使用set37Sudoku Solver38Count and Say题意难理解,计数并复述。对上一个串计数,加入第3个,因为第2个是11.所以第3个计数应该是21,两个1。第4个就是一个2,1个1,即1211遍历遇到字符串拼接优先用StringBuilder,而不是直接+,提高效率39Combination Sum找到和为target的组合回溯,dfs,递归40Combination Sum II与上一题类似,但不重复使用某元素在上一个题目的基础上,判断元素是否已存在组合中41First Missing Positive42Trapping Rain Water43Multiply Strings计算两个字符串形式的数的乘积用二维数组保存中间状态,最后的结果是一行加一列改进用一维数组存储每位的计算结果44Wildcard Matching45Jump Game II46Permutations给定的数组中无重复值,递归用一个一维数组标记元素是否访问过,对于没有访问过的元素才加入排列中47Permutations II给定的数组中有重复值,递归加剪枝将重复数值的递归过程省略(也就是说遇到之前递归调用过的数值,我们就跳过)对于重复的元素循环时跳过递归函数的调用,只对第一个未被使用的进行递归,我们那么这一次结果会出现在第一个的递归函数结果中,而后面重复的会被略过。如果第一个重复元素前面的元素还没在当前结果中,那么我们不需要进行递归。
首先我们要对元素集合排序,从而让重复元素相邻,接下来就是一行代码对于重复元素和前面元素使用情况的判断即可。48Rotate Imagen*n的矩阵顺时针旋转90度申请一个n*n的空间一次对角线对称交换,一次中线对称交换49Group Anagrams用List存超时,确实用到了转换为char数组排序,得到的字符串放到list会超时,应该用Map,最后将Map的values集合给List50Pow(x, n) 求解x的n次方(注意此处n可为负数啊)超时就要想到用递归,直接用递归做法,不要总是暴力求解先求pow(x,n/2)的值,如果n%2==0,则直接返回值*值;否则判断n是大于0还是小于0,如果大于0则值*值*x,否则值*值/x.51N-Queens 52N-Queens II53Maximum Subarray求最大子串和经典一维DP问题max(A[i],Start[i+1],All[i+1])54Spiral Matrix输出螺旋结果分析题目,发现j++,i++,j--,i--循环来做,然后要寻找终止条件,我的想法是计数加是否访问来判断是否结束机智解答中仅用四个变量来对此进行控制,少了很多空间55Jump Game 一维贪心好好分析题目,不难。56Merge Intervals合并先排序,后合并Arrays.sort的效率比List的sort的效率高太多了57Insert Interval58Length of Last Word 字符串中的最后一个单词的长度倒着遍历,找第一个空格,找到了就返回i++,59Spiral Matrix II60Permutation Sequence 求n个数的全排列中的第k个假设n=4,则有(1,2,3,4),假设k= 14;
每个数字在首位出现的次数都是3!=6,那么我们用(14-1)/3!=2,可以得到首位为3。接下来计算第2位,1/2!=0,也就是1,被取出;第3位1/1=1,也就是4,被取出;第4位,则是2a1=(k-1)/(n-1)!+161Rotate List先求全长,然后移动指针到倒数第k%n个位置如果k大于链表长度,则取k%len;否则fast先到达第k个位置,然后fast和slow一起走,知道fast走到末尾,slow走到倒数第k个位置,开始旋转List.62Unique Paths求左上角到右下角的独立路径多少个数学方法,C(m-1,(m+n-2))DP做法,转移方程为dp[i][j]=dp[i-1][j]+dp[i][j-1]一维数组DP实现,方程:dp[i]+=dp[i-1];63Unique Paths II上题的进阶版,加了路障要添加一些判断:Start和End位置有路障,直接0;对于第0行和第0列的处理,如果有路障则当前元素为0,否则为上一个元素的值;然后从1,1开始遍历,结果为dp[m-1][n-1]还有一维数组实现,方程是一样的与二维处理类似,只不过把一个列的处理放到大循环里面。64Minimum Path Sum经典DP问题转移方程与62类似65Valid Number66Plus One普通做法效率低一些机智做法呢,就是判断找到第一个位小于9的,之前大于9的都为0,小于就不用纠结进位问题,直接+1,返回结果,如果进位导致结果数组长度比原数组大,则创建一个新数组,直接置最大位置为1,其他为0,这种情况只有在各位全9才出现67Add Binary二进制加法,11+1=100注意是2进制,所以模和除都是2机智做法来源于异或操作。68Text Justification69Sqrt(x)二分搜索,构造一个end=x+1,注意类型必须是long,以免越界70Climbing Stairs爬台阶规律即斐波那契数列,递归求解会超时,所以需要一个数组来记录已经求过的斐波那契数71Simplify Path简化路径用栈,如果是..,则弹栈,如果不是".."或"."或"",则压栈72Edit Distance73Set Matrix Zeroes普通做法用Set存储符合条件的i和j用matrix本身的第一行和第一列来标记当前行或列是否清0,对第一行和第一列元素,使用两个flag标记处理74Search a 2D Matrix二分法还可以直接看当前行,小于就换行,大于就在当前行移动寻找75Sort Colors对只有012三个数的数组排序时间复杂度O(n)。给出两个标记p0=0和p2=n-1,分别记录当前0的位置和2的位置,如果当前元素等于2,则交换p2和i位置的元素,i--(之所以要i--,是因为交换过来的值有可能是0或1啊),还有计数的方法,一次遍历得到0、1和2的个数,再遍历一遍赋值;76Minimum Window Substring77Combinations求组合,与求排列类似都是递归调用,注意如何写调用过程,以及什么是退出条件78Subsets求子集位操作解法,一个长度为len的数组,其子集的个数为2^n,每一个数代表一个子集,每一位代表数组当前下标元素在不在集合内递归调用79Word Search在2D的矩阵中是否存在字符串匹配的字符串递归解决,递归条件就是长度等于待匹配的字符串
注意各种边界,是否访问过等
上下左右四个字符是否与字符串匹配不需额外空间存储,巧妙地运用了异或操作,对于访问过的字符,通过异或来表示它被访问过,再异或恢复原值80Remove Duplicates from Sorted Array II81Search in Rotated Sorted Array II82Remove Duplicates from Sorted List II83Remove Duplicates from Sorted List遍历84Largest Rectangle in Histogram85Maximal Rectangle86Partition List分割List,使得前半部分为小于x的,后半部分为大于等于x的设置两个头,一个记录小于x的,一个记录大于等于x的,然后遍历判断。最后一定记得把more.next设为null,否则链表会成环,导致死循环87Scramble String88Merge Sorted Array合并两个有序数组最好是从后面开始复制,不用移动太多元素89Gray Code格雷码巧妙地用异或90Subsets II带重复数字的数组需要在加入结果时,判断是否已存在在移除之后就判断是不是重复数字,如果是,则跳过就可以了91Decode Ways类似于爬台阶的DP一维数组来存,需要考虑当前位是否为0,为0,则找后一位,否则找后两位。138Copy List with Random Pointer深度拷贝链表用Map的键存储原来的链表,值存拷贝结果,把所有的节点拷贝过去之后,接下来,就是编译一般,根据键取值赋值时间复杂度O(n)//第一遍扫描:对每个结点进行复制,把复制出来的新结点插在原结点之后
//第二遍扫描:根据原结点的random,给新结点的random赋值
//第三遍扫描:把新结点从原链表中拆分出来
阅读全文
0 0
- leetcode刷题总结
- Leetcode刷题总结
- LeetCode刷题总结
- leetcode刷题总结
- leetcode 刷题总结
- 0731leetcode刷题总结
- 0801leetcode刷题总结
- 0802leetcode刷题总结
- 0803leetcode刷题总结
- 0804leetcode刷题总结
- 0805leetcode刷题总结
- 0806leetcode刷题总结
- 0807leetcode刷题总结
- 0808leetcode刷题总结
- 0810leetcode刷题总结
- 0811leetcode刷题总结
- 0812leetcode刷题总结
- 0813leetcode刷题总结
- 眼镜盗版,电视放弃VR,暴风VR帝国何在?
- android ndk 和sdk下载
- nmon常用监控指标
- 对生成器的理解
- Unity -- DoTween插件简介
- leetcode 刷题总结
- 客厅百寸私人影院 坚果S1激光电视6月上市
- 如何构建O2O场景,打造便捷高效的用户服务
- 小米无人机发布会汇总:对标大疆精灵,售价2499元起
- iOS常用的加密模式
- Java 字符串或字符串数组转为 List
- ubuntu无法链接wifi问题
- [python3.6]爬虫实战之爬取淘女郎图片
- 7. Reverse Integer