小菜鸡的Leetcode刷题之路SUMMARY【不定时更新】

1. (Q1, Two Sum) 对于关联容器map,在STL库中,map 是有序的,unordered_map 是无序的,无序比有序运行速度块。HashTable是unordered_map,是无序的。此外,对于map m; m.count("KEY") 返回的是"KEY"对应map的value是否为空。注意是count(KEY)而不是count[KEY]!!!Furthermore,如果需要删除map中的某一键值和对应数值,代码为m.erase("KEY").

2. (Q167,Two Sum II) From int to string: to_string(num); From stringto int: atoi(str.c_str()); From char to int: int a=10; char c=a-'0';

3. (Q7,ReverseInteger) 乘方: pow(num, index) means"num^index".

4.(Q66,Plus One) vector的用法: vector v;v.insert(v.begin()+x,3);//在(x+1)的位置上插入一个元素3    v.erase(v.begin()+x);//删除(x+1)位置上的元素.

5. (Q189,Rotate Array) 对于一个数组arr,长度为n,向右移位k,O(1)的空间复杂度,只需要做三次翻转:[0,n-k-1], [n-k,n-1], [0,n-1].

6.(Q118,Pascle's Triangle) 二维vector,初始化可以为vector>res(rows, vector(cols,0)); 此外,vector支持重新定义大小的函数res[i].resize(resize_num);

7. (Q53,Maximum Subarray) 题目涉及到最大最小值时,初始化的数字可以设置为INT_MIN,INT_MAX比较安全。这是因为中有INT_MIN和INT_MAX的宏定义,或者可以自行定义宏:#define INT_MIN0x80000000       #define INT_MAX 0x7fffffff.

8. (Q28,Implement strStr()) 截取字符串s的其中一部分,可以用include  s.substr(p, len); 其中p是子字符串的起点,len是子字符串的长度。

9. (Q326,Power of Three) 判断一个数n为整数,可以用n-(int)n==0判断。

10. (Q69,Sqrt(x)) 判断mid*mid==x是否成立的时候,可能会存在mid数值过大,导致mid*mid过大溢出。方法可以采用mid==x/mid判断(需要mid和x均为int型)。

11. (Q204,Count Primes) 初始化一个动态数组,可以采用int *array=new int[N](); 这样就可以直接调用和赋值而不需要初始化,例如array[3]这样。此外,在数n之前有多少素数这个问题,为了降低时间复杂度,可以采用厄拉多塞筛法,即定义一个被选数组用于作标记,空间复杂度O(n),时间复杂度O(nloglogn)。

12. 一些常识:

(1)如果面试官限定不可以用递归实现代码,可以考虑用栈来模拟递归的过程(例如二叉树的前中后序遍历);

(2)BFS可以采用队列的数据结构来暂时存储(例如二叉树的层序遍历);

(3)青蛙跳台阶问题可以抽象成斐波那契数列(如果青蛙每次可以跳一阶也可以跳两阶),如果青蛙每次可以跳1~n阶,那么f(n)=2^(n-1),可以用数学归纳法证明。当然,用8个2*1的小矩形去无重叠覆盖2*8大矩形的方法个数,也可以抽象为斐波那契数列;

 

 

你可能感兴趣的:(数据结构与算法,C++)