该文章只是一个思路笔记,帮助日后复习记忆。要详细解法,网上很多。不断更新中...
LeetCode学习笔记
1、Two Sum
给一个vector
注意:
1)vector
2)题目有唯一解。
3)可利用map查找为常数时间来解题。
基本思路:使用一个map
2、Add Tow Numbers
给两个链表,倒序存储一个数字的每一位,要求进行相加。主要考察链表的操作。
注意:
1)链表为空的特殊情况。
2)每个链表存储的数字只有0-9,非负。
3)进位,每个位置的进位,以及最后一位是否会产生新的进位。
基本思路:循环相加,每次判断是否到了链表的尾部。每次相加直接将值加到链表1中,并在指针移动前记录当前节点fx,为后续准备。fx的作用。若链表1先结束(即为空),则使用fx指向链表2对应的位置、若链表2先结束,fx已经指着链表1。fx的作用,如有进位,则一直遍历到链表1或者2的结尾,此时如果还有进位,不断被更新的fx刚刚好指向链表的最后一个位置,只需new一个节点,fx指向新节点即可。若链表1和2同时为空,且还有进位,也可以使用fx去指向一个新节点。
3、Longest Substring Without RepeatingCharacters
找字符串中最长的无重复字符的子字符串。
注意:
1)字符串包含的数字,目测只有数字0-9和大小写字母。即在0-255之间。
基本思路:定义一个数组isExist[255]={false};保存当前所检测的子字符串的字符。设置两个标记,初始为0。固定i一个,滑动另一个j去获取子字符串。每次判断j的位置是否存在isExist之中,若不存在,比如当前字符为‘a‘,则isExist[‘a’]=true;【此时使用的是ASCII码作为下标】,然后继续移动j。若当前j所指的字符是已存在的。首先要计算已找到的子字符串的长度,跟maxL比较,然后保存较长者。然后i向后滑动,一直滑到与j所指相同的字符的下一个,滑动的期间要将所指的字符在isExist中置为false。然后j继续向后,重复上述过程,一直到字符串的结尾。
4、Median of Two Sorted Arrays
求两个排序好的vector的中间数。
注意:
1)已经排序好的
2)可能为空,vector内可以重复,vector间可以相等
3)两个vector不会同时为空
基本思路:首先根据两个vector的size()计算要找的位置。这里记录要找的位置的下一个。比如:size的总和是偶数:10,那么,要找的位置应该是5和6,然后求均值。size的总和是奇数:11,那么要找的位置应该是6。那么在该思路里面,我们要找的位置应该是7。代码中由于vector下标从0开始,所以要记录6。定义两个迭代器,分别在两个vector的头部开始,每次都比较两个迭代器所指的值,将较小的一方push到另一个vectorp中,然后较小的一方的迭代器向后移动移位,总数count++。若总数count等于要找的个数,则p中已经存有中间数了,返回对应的中间数。若某个迭代器达到了end,则中数一定在另一个vector中,这时利用count的信息和要找的个数,可以知道还需要向p中push多少个数,于是可以继续移动。然后,中数会依旧在p中,一样操作。
5、Longest Palindromic Substring
找字符串中最长的回文子字符串。最大的长度为1000,存在唯一的解。
注意:
1)字符串可能为空。
2)字符串长度为1时,可以直接返回。
基本思路:动态规划,首先建立一个f[1000][1000]= {false};然后让赋值对角线为true.即每个单一字符都是回文。然后再判断长度为2的子字符串是否为回文。然后开始找长度为3一直到n的字符串。如果s[i] ==s[j] && f[i+1][j-1] == true,则f[i][j]为回文,更新maxL和记录第一个字符的位置。最后返回结果。
6、ZigZag Conversion
字符串转之型字,纯粹的找规律。
注意:
1)如果row == 1或者字符串的长度==0,可直接放回字符串
基本思路:遍历每一行i,i必须小于row,因为最多只有row,i也必须小于字符串长度len,因为字符串的长度可能小于row。每一行开头都是indx = i,后对于第一行和最后一行,之后接连出现的每一个都是indx+= 2*row-2,同时indx注意小于len。而对于中间的那些行,之后接连出现的每一个,奇数位的indx+=2*(row-i-1);偶数位indx+=2*i;
7、Reverse Integer
反转int
注意:
1)正负数
2)int的最大值和最小值:2147483647 和 – 2147483648
基本思路:首先先判断输入x的正负,若为负数不能直接绝对值然后赋值给一个int,因为最小的负数的绝对值超过了最大的整数。因此可定义一个longlong类型中间变量x2,和同类型的y,y初始化为0。然后x2每次除以10,取余数,然后余数加上y乘以10,x2则等于自身除以10后的数,这时y在增长。如x为正数,则y不能超过2147483647,若x为负数,则y不能超过2147483648,最后给y正确的符号,转换为int,返回。
8、String to Integer (atoi)
字符串转int,这题思路简单,只有几个注意
注意:
1)字符串的开头可能为空格,后面才有数字。
2)” -12a12” 输出:-12
3)”+-2” 输出 0
4)正数超过最大值:输出最大值2147483647
5)负数超过最小值:输出最小值2147483648
9、Palindrome Number
回文数字
注意
1)负数,return false;
2)整数 < 10,returntrue
基本思路:利用出除以10取余数,将数字截成两半,直接判断是否相等即可。
110、Balanced Binary Tree
平衡二叉树的检查。平衡二叉树,根节点的左子树和右子树的深度差绝对值不大于1,以每个子节点为根节点的子树都是平衡二叉树。则该树为平衡二叉树。
注意:
1)可能为空树,空树return true
基本思路:递归。递归地检查是否满足条件。利用引用来增加返回值。
111、Minimum Depth of Binary Tree
二叉树的最小深度。
注意
1)必须找到每个叶子节点
2)空树返回0
基本思路:递归地去找左子树和右子树的最小深度。