题解 | #乘积为正数的最长连续子数组#

乘积为正数的最长连续子数组

https://www.nowcoder.com/practice/0112b9b5a09048d89309f55ea666db91

思路:
首先乘积为正数,只取决于因数的正负和是否为0,所以所有数只需分为正数、负数和0三种而不用关心具体数值。
然后是递推过程,需要用两个变量dpmaxn和dpfmaxn记录以当前数结尾的乘积为正/负数的连续子数组最长长度,然后用一个变量maxn记录最大的dpmaxn值,最后这个maxn就是我们要求得的结果。
时间复杂度:O(n)
空间复杂度:O(1)
代码如下,目前用时和内存占用都是最少的
#include<cstdio>

using namespace std;

template <typename T>
inline void read(T& f) {
	f = 0;
	T fu = 1;
	char c = getchar();
	while (c < '0' || c > '9') {
		if (c == '-') {
			fu = -1;
		}
		c = getchar();
	}
	while (c >= '0' && c <= '9') {
		f = (f << 3) + (f << 1) + (c & 15);
		c = getchar();
	}
	f *= fu;
}
template <typename T>
inline void print(T x) {
	if (x < 0) putchar('-'), x = -x;
	if (x < 10) putchar(x + 48);
	else print(x / 10), putchar(x % 10 + 48);
}

int main(){
    int dpmaxn = 0, dpfmaxn = 0;        //以i结尾的正/负数的子数组最长长度
    int tmaxn, tfmaxn;
    int n, num, maxn = 0;
    
    read(n);
    while(n--){
        read(num);
        if(num > 0){
            tmaxn = dpmaxn + 1;
            tfmaxn = dpfmaxn == 0 ? 0 : dpfmaxn + 1;
        }
        else if(num < 0){
            tmaxn = dpfmaxn == 0 ? 0 : dpfmaxn + 1;
            tfmaxn = dpmaxn == 0 ? 1 : dpmaxn + 1;
        }
        else{
            tmaxn = tfmaxn = 0;
        }
        dpmaxn = tmaxn, dpfmaxn = tfmaxn;
        if(dpmaxn > maxn)maxn = dpmaxn;
    }
    print(maxn);
    
    return 0;
}


全部评论

相关推荐

头发暂时没有的KFC总裁:找廉价劳动力罢了
点赞 评论 收藏
分享
暮雨轻歌:看起来hr不能接受我菜查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务