-
第一章 引论
- 一些数学公式以及证明方法
-
第二章 算法分析
-
了解O,Ω,Θ与o在计算相对增长率上的含义
-
分析程序运行时间的一般法则(一般用O表示):
-
例子:求最大子序列和。采用分治的思想可以将程序运行时间降至O(NlogN);采用动态规划的思想可以将时间降至O(N)
# 分治思想 class Solution { public: struct Status{ int lSum,rSum,mSum,iSum; }; Status pushUp(Status lSub, Status rSub) { int iSum = lSub.iSum + rSub.iSum; int lSum = max(lSub.lSum, lSub.iSum + rSub.lSum); int rSum = max(rSub.rSum, rSub.iSum + lSub.rSum); int mSum = max(max(lSub.mSum, rSub.mSum), lSub.rSum + rSub.lSum); return (Status) {lSum, rSum, mSum, iSum}; } Status get(vector<int>& a, int l, int r) { if(l == r) return (Status) {a[l], a[l], a[l], a[l]}; int m = (l + r) >> 1; Status lSub = get(a, l, m); Status rSub = get(a, m + 1, r); return pushUp(lSub, rSub); } int maxSubArray(vector<int>& nums) { return get(nums, 0, nums.size() - 1).mSum; } };
# 动态规划 class Solution { public: int maxSubArray(vector<int>& nums) { int pre = 0, maxAns = nums[0]; for (const auto &x: nums) { pre = max(pre + x, x); maxAns = max(maxAns, pre); } return maxAns; } };
-
例子:对分查找、欧几里得算法求最大公因数、幂运算
-
-
第三章 表、栈、队列
- 表