这是一个系列篇,主要是用python刷题,适用于喜欢用python刷题的小伙伴一起交流和讨论,之前作者基于java、c\c++都刷过,这次使用python更加系统的根据校招高频题进行分析。
首先分析一下做题需要注意的重点内容:
其次是高频模块分析:
时间复杂度分析:(不得不承认,时间复杂度和空间复杂度是面试官考察的重点,通常在做完一道算法题之后就会问这个问题。所以需要重点掌握)
for(int i = 0; i < n; i++) {
} //O(m)时间复杂度
for(int i = 0; i < m; i++) {
for(int i = 0; i < n; i++) {
}
} //O(mn)时间复杂度
func(int val, int a[], int start, int end) {
if(start > end) {
return false;
}
int mid = (start + end) / 2;
if(val == a[mid]) {
return true;
} else {
if(val < a[mid]) {
return func(val, a, start, mid - 1);
} else {
return func(val, a, mid + 1, end);
}
}
return false;
} //最常见的二分法是O(log(n))时间复杂度
空间复杂度分析:
//空间O(1),时间O(n),错误返回a={1, 6, 11, 16}
for(int i = 1; i < m; i++) {
a[i] = a[i] + 5;
}
//空间O(n),时间O(n),正确返回a = {1, 6, 8, 10}
int b[m];
b[0] = a[0];
for(int i = 1; i < m; i++) {
b[i] = a[i];
a[i] = b[i - 1] + 5;
}
//空间O(1),时间O(n),正确返回a = {1, 6, 8, 10}
int tmp = a[0];
for(int i = 1; i < m; i++) {
int tmp1=a[i];
a[i] = tmp+ 5;
tmp = tmp1;
}
//空间O(1),时间O(n),正确返回a = {1, 6, 8, 10}
for(int i = m – 1; i > 1; i--) {
a[i] =a[i - 1] + 5;
}
复杂度总结:(刷题的基础就是先要掌握时间复杂度和空间复杂度的分析,划重点)
1)题解(1)单纯的通过递归进行计算,会显示超时,因为在每一个状态都会额外的多计算其子状态结果,然后才能得到当前状态结果。
2)题解(2)则是使用空间换时间,通过存储每一个状态的信息,使得在下一次到达这个状态时直接返回存储的该节点状态即可,无需进行额外的计算操作。这也就是俗称的以记忆化搜索操作。
#(1)超过时间限制,时间复杂度O(!),空间复杂度O(1) 报错,超时错误
int numWays(int n){
if(n == 0 || n == 1) {
return 1;
}
return numWays(n - 1) + numWays(n - 2);
}
#(2)空间换时间 空间复杂度O(n),时间复杂度O(n)
int num[101] = {0};
int numWays(int n){
if(n == 0 || n == 1) {
return 1;
}
if(num[n - 1] == 0) {
num[n - 1] = numWays(n - 1) % 1000000007;
}
if(num[n - 2] == 0) {
num[n - 2] = numWays(n - 2) % 1000000007;
}
return (num[n - 1] + num[n - 2]) % 1000000007;
}