题目链接:
第一题:50. Pow(x, n)
第二题:53. 最大子序和
第三题:
实现 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;
}
}
};
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
给定一个整数数组 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