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