您的位置:首页 > 其它

leetCode: 求最大子段和,最大子段乘积,求除了其本身之外的其他数的乘积

2016-04-17 13:32 357 查看
/**
最大子段和:
*/
int maxSubArray(vector<int>& nums) {
vector<int>res(nums.size(),INT_MIN);
res[0] = nums[0];
for(int i=1;i<res.size();i++){
res[i] =max(res[i-1]+nums[i],nums[i]);
}
int result=INT_MIN;
for(int e:res){
if(e>result)
result = e;
}
return result;
}
/**
最大连续子段乘积:
由于乘法涉及到符号,所以不能单单保存当前最大值,还要保存当前最小值,
来为下一步求最大值做准备
*/
int maxProduct(vector<int>& nums) {
int Max = nums[0];
int Min = nums[0];
int preMax = nums[0];
int preMin = nums[0];
int result = nums[0];
for(int i =1;i<nums.size();i++){
Max = max(max(preMax*nums[i],preMin*nums[i]),nums[i]);
Min =  min(min(preMax*nums[i],preMin*nums[i]),nums[i]);
result = max(Max,result);
preMax = Max;
preMin = Min;
}
return result;
}
/**
求除了它本身之外的其他数的乘积:
For example, given [1,2,3,4], return [24,12,8,6].
*/
vector<int> productExceptSelf(vector<int>& nums) {
vector<int> res(nums.size(),0);
int count =0;
int index =-1;
for(int i=0;i<nums.size();i++){
if(nums[i]==0)
{
index = i;
count++;
}
}
if(count ==0){
res[0] =1;
for(int i=1;i<nums.size();i++)
res[0]*=nums[i];
for(int i=1;i<nums.size();i++)
res[i] = res[i-1]*nums[i-1]/nums[i];
return res;
}
else if(count ==1){
res[index] = 1;
for(int i=0;i<nums.size();i++){
if(i==index)
continue;
else
res[index] *= nums[i];
}
}
else
return res;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: