gh_mirrors/leet/leetcode项目:分治策略题解实战

gh_mirrors/leet/leetcode项目:分治策略题解实战

【免费下载链接】leetcode LeetCode题解,151道题完整版。广告:推荐刷题网站 https://www.lintcode.com/?utm_source=soulmachine 【免费下载链接】leetcode 项目地址: https://gitcode.com/gh_mirrors/leet/leetcode

分治策略(Divide and Conquer)是解决复杂问题的高效方法,通过将大问题分解为小问题逐个击破,最终合并结果得到答案。本文基于gh_mirrors/leet/leetcode项目中的C++/chapDivideAndConquer.tex,结合具体题解案例,带你掌握分治思想在LeetCode中的实战应用。

分治策略核心原理

分治策略三步骤:

  1. 分解(Divide):将原问题拆分为规模更小的子问题
  2. 解决(Conquer):递归求解子问题
  3. 合并(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;
    }
};

算法图示

二分查找过程可参考类似问题的搜索空间缩减示意图: 二分查找示意图

分治策略适用场景

  1. 问题可拆分为独立子问题
  2. 子问题与原问题结构相似
  3. 存在明确的终止条件
  4. 合并结果复杂度低于直接求解

项目资源导航

通过本文案例可见,分治策略能显著降低问题复杂度。建议结合项目中更多题解练习,如Sqrt(x)Pow(x,n)的关联训练,深化对分治思想的理解。收藏本文,持续关注项目更新获取更多算法实战指南。

【免费下载链接】leetcode LeetCode题解,151道题完整版。广告:推荐刷题网站 https://www.lintcode.com/?utm_source=soulmachine 【免费下载链接】leetcode 项目地址: https://gitcode.com/gh_mirrors/leet/leetcode

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值