相关示例代码:github
1. 递归算法的时间复杂度计算
递归问题必须遵循此模型时,子问题规模必须相等,可以直接得出时间复杂度,其中:
N:问题规模
N/b:子问题规模
a:子问题调用了a次
a,b,d都是常数
例子,递归求数组最大值算法,其时间复杂度模型为 T(N) = 2 * T(N/2) + O(N^0)
结果为O(N),计算方法如图
N为数组长度
b为2,因为子问题规模为N/2
a为2,因为分成两个子问题
d为0,因为其他逻辑均为常数时间复杂度
public class GetMax {
public static int getMax(int[] arr) {
return process(arr, 0, arr.length - 1);
}
public static int process(int[] arr, int left, int right) {
if (left == right) {
return arr[left];
}
int mid = left + ((right - left) >> 1); //常数复杂度
int leftMax = process(arr, left, mid); //子问题 N/2规模,第一次调用
int rightMax = process(arr, mid, right); //子问题 N/2规模,第二次调用
return leftMax > rightMax ? leftMax : rightMax;
}
}
2.常见问题
- 如何用栈实现队列:两个栈来回倒
- 如何用队列实现栈:两个队列来回倒
以下问题,请见代码 github
- 如何用数组实现固定大小的栈或者队列?
- 如何获取栈中数据的最小值?