最大连续乘积子数组
遍历数组时计算当前最大值,不断更新
令imax为当前最大值,则当前最大值为 imax = max(imax * nums[i], nums[i])
由于存在负数,那么会导致最大的变最小的,最小的变最大的。因此还需要维护当前最小值imin,imin = min(imin * nums[i], nums[i])
当负数出现时则imax与imin进行交换再进行下一步计算
时间复杂度:O(n)
class Solution {
public:
int maxProduct(vector<int>& nums) {
int ans = -999999999; //这个是用来保存最大值
int Max=1,Min=1; //这里都设置为1 ,原因在下面两行max,min函数中
for(int i=0;i<nums.size();++i){
if(nums[i]<0){
Max^=Min^=Max^=Min;
}
Max = max(Max*nums[i],nums[i]);
Min = min(Min*nums[i],nums[i]);
ans = max(ans,Max);
}
return ans;
}
};
最大连续子数组和
思路:
这里只要一个循环就搞定,从头到尾遍历,用一个变量记录num当前所到的值是正数还是负数,如果是负数,就直接把之前的值去掉,把当前的值赋值给num变量即可,然后用一个全局变量保存最大值。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if(nums.size()==0) return 0;
int ans=-99999999;
int num=0;
for(int i=0;i<nums.size();++i){
if(num < 0){
num = nums[i];
}else{
num += nums[i];
}
if(ans<num){
ans = num;
}
}
return ans;
}
};