datawhale组队训练——LeetCode分类练习——分治

题目链接:
第一题:50. Pow(x, n)
第二题:53. 最大子序和
第三题:

50. Pow(x, n)

题目描述

实现 pow(x, n) ,即计算 x 的 n 次幂函数。

示例 1:
输入: 2.00000, 10
输出: 1024.00000

示例 2:
输入: 2.10000, 3
输出: 9.26100

示例 3:
输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25
说明:
-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。

思路分析

程序代码

c++语言

class Solution {
public:
    double myPow(double x, long long  n) {
    //题目中给的是int n,但是有个数据是-2147483648,我用abs函数之后就超过了int的范围,所以就把int换成了longlong
        double w=x,s=1;
        if(x==1) return 1;
        if( n>=0 ) {
        //对于大于0的数和小于0的数单独处理,下面为快速幂代码
            while(n) {
		        if(n&1==1) s=s*w;
		        w=w*w;
		        n>>=1;
	        }
	        return s;
        }
	    else {
            n=abs(n);
            while(n) {
		        if(n&1==1) s=s*w;
		        w=w*w;
		        n>>=1;
	        }
	        s=(1.0)/s;
            return s;
        }
    }
};

通过详情:
datawhale组队训练——LeetCode分类练习——分治_第1张图片

Python语言

class Solution:
    def myPow(self, x: float, n: int) -> float:
        res = 1.0
        if n < 0:
            n = abs(n)
            x = 1/x
        while (n>0):
            if (n&1):
                res = res*x
            x *=  x
            n >>= 1
        return res

通过详情:
datawhale组队训练——LeetCode分类练习——分治_第2张图片

53. 最大子序和

题目描述

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:
输入: [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。

思路分析

O(N*N)
先用sum[i]来表示前i个数的和,这样我们就只要枚举区间端点 i 和 j ,用sum[i]-sum[j-1]来表示这一段区间和,每次更新的时候比较一下大小以此来更新答案。
O(N)
此时间复杂度要用dp来解决。
分治版
这里的分治思想跟线段树查询区间最大值有点像,对于左右子区间分别递归,返回相应的最大值,并且将左右区间的对比一下,取最大值。

程序代码

c++ O(N*N)

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int sum[10005],ans=-2147483647;//求前缀和
        int n=nums.size();
	    memset(sum,0,sizeof(sum));
	    for(int i=0;i<n;++i) {sum[i+1]=sum[i]+nums[i];}
	    for(int i=1;i<=n;++i) 
		    for(int j=1;j<=i;++j)
			    ans=max(ans,sum[i]-sum[j-1]);
			    //求区间j到i的区间和
        return ans;
    }
};

c++ O(N)

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;
    }
};

c++ 分治版


Python

你可能感兴趣的:(LeetCode,蓝桥杯,分治)