gh_mirrors/leet/leetcode项目:分治策略题解实战
分治策略(Divide and Conquer)是解决复杂问题的高效方法,通过将大问题分解为小问题逐个击破,最终合并结果得到答案。本文基于gh_mirrors/leet/leetcode项目中的C++/chapDivideAndConquer.tex,结合具体题解案例,带你掌握分治思想在LeetCode中的实战应用。
分治策略核心原理
分治策略三步骤:
- 分解(Divide):将原问题拆分为规模更小的子问题
- 解决(Conquer):递归求解子问题
- 合并(Combine):整合子问题结果得到原问题答案
实战案例1:Pow(x, n)
问题描述
实现Pow(x, n)函数,计算x的n次幂(C++/chapDivideAndConquer.tex)。
分治思路
利用指数的数学性质拆分问题:
$x^n = x^{n/2} \times x^{n/2} \times x^{n%2}$
当n为偶数时:$x^n = (x^{n/2})^2$
当n为奇数时:$x^n = (x^{n/2})^2 \times x$
代码实现
//LeetCode, Pow(x, n)
// 二分法,$x^n = x^{n/2} * x^{n/2} * x^{n\%2}$
// 时间复杂度O(logn),空间复杂度O(1)
class Solution {
public:
double myPow(double x, int n) {
if (n < 0) return 1.0 / power(x, -n);
else return power(x, n);
}
private:
double power(double x, int n) {
if (n == 0) return 1;
double v = power(x, n / 2);
if (n % 2 == 0) return v * v;
else return v * v * x;
}
};
复杂度分析
- 时间复杂度:O(logn),问题规模每次减半
- 空间复杂度:O(logn),递归调用栈深度
实战案例2:Sqrt(x)
问题描述
实现int sqrt(int x)函数,计算非负整数x的平方根(C++/chapDivideAndConquer.tex)。
分治思路
通过二分查找在[1, x/2]范围内寻找满足$mid^2 \leq x < (mid+1)^2$的整数mid。为避免溢出,使用$x/mid$比较代替$mid \times mid$。
代码实现
// LeetCode, Sqrt(x)
// 二分查找
// 时间复杂度O(logn),空间复杂度O(1)
class Solution {
public:
int mySqrt(int x) {
int left = 1, right = x / 2;
int last_mid; // 记录最近一次mid
if (x < 2) return x;
while(left <= right) {
const int mid = left + (right - left) / 2;
if(x / mid > mid) { // 不要用 x > mid * mid,会溢出
left = mid + 1;
last_mid = mid;
} else if(x / mid < mid) {
right = mid - 1;
} else {
return mid;
}
}
return last_mid;
}
};
算法图示
分治策略适用场景
- 问题可拆分为独立子问题
- 子问题与原问题结构相似
- 存在明确的终止条件
- 合并结果复杂度低于直接求解
项目资源导航
- 完整分治题解:C++/chapDivideAndConquer.tex
- 其他算法专题:
- 项目主页:README.md
通过本文案例可见,分治策略能显著降低问题复杂度。建议结合项目中更多题解练习,如Sqrt(x)与Pow(x,n)的关联训练,深化对分治思想的理解。收藏本文,持续关注项目更新获取更多算法实战指南。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




