枚举算法技巧

枚举算法即遍历已有的集合,判断哪些元素符合要求,最终求解问题。

例如 LeetCode 第一题,两数之和:

1
2
3
4
5
6
7
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

示例 1:

  输入:nums = [2,7,11,15], target = 9
  输出:[0,1]
  解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]

暴力枚举

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        for (int i = 0; i < nums.size() - 1; i++) {
            for (int j = i + 1; j < nums.size(); j++) {
                if (nums[i] + nums[j] == target) {
                    return {i, j};
                }
            }
        }
        return { 0, 0 };
    }
};

时间复杂度:\(O(N^2)\) ,空间复杂度:\(O(1)\)

C++ 奇异的递归模板 CRTP

CRTP (The Curiously Recurring Template Pattern) 是 C++ 模板中的一种习惯用法:子类继承时将自己作为基类的模板参数。

一般形式:

1
2
3
4
5
6
7
8
template <typename T>
class Base {

};

class Derived: public Base<Derived> {

};

这样就能在基类访问子类的成员变量及函数。

并查集的概念及实现

动态连通性问题

“连通” 是一种等价关系,两个对象 p 和 q 是相连通的,意味着它具有:

  • 自反性:p 和 p 是相连的
  • 对称性:如果 p 和 q 是相连的,那么 q 和 p 也是相连的
  • 传递性:如果 p 和 q 相连且 q 和 r 相连,那么 p 和 r 也是相连的

等价关系将对象分为多个等价类,在这个,当且仅当两个对象相连通时才属于同一个等价类。

动态规划之背包问题

0-1 背包

给你一个可装载重量为 W 的背包和 N 个物品,每个物品有重量和价值两个属性。其中第 i 个物品的重量为 wt[i],价值为 val[i],现在让你用这个背包装物品,最多能装的价值是多少?

读《C++ API 设计》总结

优秀 API 的特征

问题域建模

API 应该对它所解决的问题提供良好的逻辑抽象。当把 API 文档提供给用户时,他应该能够理解接口中的概念并且知道它的工作机制。

API 应该对问题域的关键对象建模,即面向对象设计。一般使用 UML 类图或对象图表示对象模型。

隐藏实现细节

API 应该隐藏所有的实现细节,避免修改 API 对已有的客户造成影响。