您的位置:首页 > 其它

LeetCode学习笔记

2015-07-21 21:10 316 查看
该文章只是一个思路笔记,帮助日后复习记忆。要详细解法,网上很多。不断更新中...

LeetCode学习笔记
1、Two Sum

       给一个vector<int>和一个整数int,要求找出vector<int>里面相加和等于int的两个数。可以假设有唯一解。这道题主要考察的是时间复杂度。不可以使用暴力破解。

注意:

1)vector<int>里面没有重复的数。

2)题目有唯一解。

3)可利用map查找为常数时间来解题。

基本思路:使用一个map<int,int>保存对应数字以及其在vector中的下标。从头遍历vector<int>,使用count函数去判断当前值是否存在map<int,int>之中,如果不存在也insert进去,然后在寻找对应的另一个加数是否存在。一直遍历,一定为找到这两个加数。然后判断两个加数谁的下标小,再按要求返回。最终的方案时间复杂度为O(n)。

 

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

       基本思路:递归地去找左子树和右子树的最小深度。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  LeetCode 算法