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

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

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

#include <iostream>
#include <vector>
#include <climits>

using namespace std;

class solution
{
public:
    int getResult(vector<int> &nums)
    {
        int n = nums.size();
        if (n == 1)
        {
            return nums[0] > 0 ? 1 : 0;
        }
        
        vector<vector<int>> dp(n + 1, vector<int>(2, 0));
        /*
        dp[i][0] -> negtive
        dp[i][1] -> positive
        */
        int ret = INT_MIN;
        if (nums[0] < 0)
        {
            dp[0][0] = 1;
        }
        else if (nums[0] > 0)
        {
            dp[0][1] = 1;
        }
        
        for (int i = 1; i < n; i++)
        {
            if (nums[i] > 0)
            {
                dp[i][0] = dp[i - 1][0] > 0 ? dp[i - 1][0] + 1 : 0;
                dp[i][1] = dp[i - 1][1] + 1;
            }
            else if (nums[i] < 0)
            {
                dp[i][0] = dp[i - 1][1] + 1;
                dp[i][1] = dp[i - 1][0] > 0 ? dp[i - 1][0] + 1 : 0;
            }
            else
            {
                dp[i][0] = 0;
                dp[i][1] = 0;
            }
            ret = max(ret, dp[i][1]);
        }
        
        return ret;
    }
};

int main()
{
    int n;
    solution mSolution;
    
    while (cin >> n)
    {
        cin.get();
        vector<int> nums(n);
        for (int i = 0; i < n; i++)
        {
            cin >> nums[i];
        }
        cin.get();
        cout << mSolution.getResult(nums) << endl;
    }
    
    return 0;
}


状态优化

#include <iostream>
#include <vector>
#include <climits>

using namespace std;

class solution
{
public:
    int getResult(vector<int> &nums)
    {
        int n = nums.size();
        if (n == 1)
        {
            return nums[0] > 0 ? 1 : 0;
        }
        
        int dpNeg = 0, dpPos = 0;
        
        int ret = INT_MIN;
        if (nums[0] < 0)
        {
            dpNeg = 1;
        }
        else if (nums[0] > 0)
        {
            dpPos = 1;
        }
        
        for (int i = 1; i < n; i++)
        {
            if (nums[i] > 0)
            {
                dpNeg = dpNeg > 0 ? dpNeg + 1 : 0;
                dpPos = dpPos + 1;
            }
            else if (nums[i] < 0)
            {
                int tmp = dpPos + 1;
                dpPos = dpNeg > 0 ? dpNeg + 1 : 0;
                dpNeg = tmp;
            }
            else
            {
                dpNeg = 0;
                dpPos = 0;
            }
            ret = max(ret, dpPos);
        }
        
        return ret;
    }
};

int main()
{
    int n;
    solution mSolution;
    
    while (cin >> n)
    {
        cin.get();
        vector<int> nums(n);
        for (int i = 0; i < n; i++)
        {
            cin >> nums[i];
        }
        cin.get();
        cout << mSolution.getResult(nums) << endl;
    }
    
    return 0;
}


全部评论

相关推荐

2024-12-29 11:08
湖南工业大学 Java
程序员牛肉:简历没什么大问题了。 而且不要再换项目了。三月份就开暑期实习了,现在都一月份了。实在来不及重新开一下项目了。把一个项目写完或许很快,但是把一个项目搞懂吃透并不简单。所以不要换项目了,把你简历上面的两个项目好好挖一挖吧。 具体 体现在:你能不能流利的说出你的项目的每一个功能点代码实现?你能不能说出在这块除了A技术之外,还有其他技术能够实现嘛?如果有其他技术能够实现,那你这块为什么选择了你当前用的这个技术?
投递牛客等公司
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务