- Palindrome Partitioning II这道题还是很麻烦,求最小的cut,需要用到动态规划的dp算法,否则会超时。首先求出字符串的各子串是否是回文,如果回文则为true。由于每次调用回文函数会浪费时间,因此使用dp算法从长度为0和1的字符串开始不断增加字符串的长度,每次进度为2。之后先使用数组,存储字符串各子串最少需要多少cut,最后返回整个字符串需要多少cut,这里还是要用到dp算法。
- Surrounded Regions 这个解法简单,但是一开始比较难想到。首先找到所有最外圈的O,它们是没有被围住的,对这些O使用flood fill算法找到与其连通的内部O,找到后标记为其他符号,如“#”。在找连通的O时使用循环和广度优先算法。最后将标记为“#”的O转为O,而为被标记为“#”的O一定被围住,转为“X”。
- Sum Root to Leaf Numbers 树的题目,比较简单,用递归。
-
- Longest Consecutive Sequence计算当前值连续的序列可以考虑i++和i--循环得到
-
- Factorial Trailing Zeroes这道题很具有魔性,会想的比较难。其实比较简单,首先题目中有阶乘不要忽略。其次阶乘中2的个数比5多,只要找出所有的数值中会出现多少个5就行。当前值是5的多少倍就出现了多少次5,但每隔5^n次倍会多加几个5(具体25,75,100多加一次5,125,250,375多加2次5),所以最后的结果为n/5+n/25+n/125+.......所以最后的结果会很简单。
- Excel Sheet Column Number思路太过简单,不想追述,要用到string的toCharArray的api。
- Excel Sheet Column Title这道因为有上面那道就更简单了,但是因为A不是0是1会有点绕不过来。
- Majority Element相对难一些吧,用到divide and conquer的思想,问题是如何在O(n)的时间找出来。其中用到两个数count和majorityElement,当count为0时这个majorityElement等于当前值,当前值如果等于majorityElement,则count++,否则count--。如果array中存在majorityElement的话,最后得到的那个majorityElement一定是最多的那个数。
- Valid Palindrome很简单,使用两个指针即可,此外Charater有isLetter和isDigit这两个方法。
- Largest Number这道题也挺简单的,但是要想到String s1=""+num1+num2;String s2=""+num2+num1。然后比较s1和s2的字典顺序即可得到num1和num2谁放在前面。
- Compare Version Numbers,特别简单,但容易出错,首先字符串分割“.”,"|","*","\"等符号时都应该多加注意,加入反斜杠。其次可以用到expr?A:B这种表达式。
- Word Ladder这道题知道用广度优先遍历算法,但是之前忘记广度优先遍历算法具体应该怎么写,重新看了遍算法导论,首先要用到队列,其次还要保存到每个路径的距离即可。此外,char数组转成String,只需要String tmpString=new String(wordArray);即可。此外这道题的出法上有点问题。
- Two Sum看上去挺简单的,但是要找到更好的解决方案有点困难。使用HashMap的解决,在hashmap中保存target与当前数的差值,与当前数的下标,当后面遍历到的数在map中已保存,则取出map中的key以及当前数的下标,这即为我们想要的结果。
- Add Two Numbers这道题陷入了误区(果然越简单的题目越要慎重),我本来想计算出各链表所代表的数字,然后加和起来再反转成链表,但是要考虑到java的data是有范围的,当数字非常大时会溢出。其实这跟bit位一样,直接加和进位就可以了,所以说陷入了误区。另外链表操作需要注意,可以设置起始位(数值为0),返回起始位的下一位即可。
- Longest Substring Without Repeating Characters这道题看上去比较难,做起来还可以,但容易出错。主要是保存三个index,以及一个最大值。第一个index是上一次遍历到的无重复子字符串的起始index(preIndex),第二个index是当前遍历的字符(curIndex),第三个index(traIndex)是从preIndex开始到curIndex-1结束匹配在这段子字符串中是否存在index与curIndex所指向的字符相同的字符,有则将curIndex-preIndex与保存的最大值相匹配,并preIndex=traIndex+1;
- ZigZag Conversion这道被定位为easy,也的确简单,只是之前不知道ZigZag pattern是什么,所以wiki了一下,然后找规律就可以了。我的做法是对每行的子字符串存在数组里,从传入的字符串第0位开始遍历直到最后一位。对每一个index求余数,然后得到相应的行数,添加到该行对应的数组上。但是貌似我这种做法速度相对慢一些,可能是因为字符串的相加的操作比较多。另一种做法是先new一个字符数组,长度与传入字符串相同,从字符数组从左到右开始填充,以步长的方式拿到当前应该填充的字符,在第一行和最后一行只要走2(nRows-1)的步长,但其他行还需要走一个2(nRows-1)-2i,i为当前所在行。这样得出来的结果性能相对好一些。
- Number of 1 Bitsleetcode上新增加的题目,都太过于简单了,这个就是算bit位上有多少个1,使用移位操作即可,但是比较好奇的是其testcase中是怎么输入int越界的数2147483648的。
- Reverse Bits和上题一样是移位操作。
- Roman to Integer这道题也比较简单,毕竟定义为easy,就是要了解罗马数字的规律,总共只有几个字符[('I',1),('V',5),('X',10),('L',50),('C',100),('D',500),('M',1000)],此外,大数字在小数字的左边直接相加即可,大数字在小数字的右边直接相减。
- Median of Two Sorted Arrays这道题折腾很久,在leetcode上难度标记为hard。这道题的问题可以转化为找两个排序数组中第k个数问题。与此同时,这道题规定了时间复杂度为O(lg(m+n)),要考虑以下两种情况:1.当A中元素个数小于k/2时,舍弃掉B中前k/2个元素。2.当A[k/2-1]小于B[k/2-1]时,可以直接舍弃A中前k/2个元素。这样就能在限定的时间复杂度内找到第k个元素。
- Longest Palindromic Substring又是一个求字符串回文的题目,一般使用动态规划,但是这里貌似使用DP所需要的空间会超出限制,主要原因在保存DP的数组上。使用比较简单的算法,中心展开,从字符串的第一个字母开始到最后一个字母,从该字母展开找到最长回文即可。
- Reverse Integer简单,注意判断overflow,先转为正值,然后保证当前值不会超出Integer.MAX_VALUE;
- String to Integer (atoi)首先atoi是指,输入一段字符串,如果第一个非空格字符存在,是数字或者正负号则开始做类型转换,之后检测到非数字(包括结束符 \0) 字符时停止转换,返回整型数。否则,返回零。解决方案简单,注意各种情况的判断。
- Palindrome Number简单,先找到最高位是10的多少倍数,然后匹配这个index左右两边的值,要善于利用/和%符号,以及循环语句,但是容易出错。
- Rotate Array题目说想出三种解法,但只想了一种就懒得想了。将k临界点左右两边的子字符串先倒序,再将整个字符串倒序
- Regular Expression Matching用递归解决,思路简单,但是要讨论清楚各种可能的情况。
- Longest Common Prefix遍历数组中的元素,根据上一轮比较的结果得到最新的longestCommonString.
- Merge k Sorted Lists两个list merge比较简单,k个list较难,本来想遍历lists再merge,结果timeout了。因此使用divide and conquer先两个两个merge,最后merge在一起。
【记录】leetcode实践(二)
最新推荐文章于 2022-02-22 22:23:27 发布