题解 | #连续子数组的最大乘积#

连续子数组的最大乘积

https://www.nowcoder.com/practice/abbec6a3779940aab2cc564b22d36859

#include <algorithm>
#include <climits>
#include <deque>
#include <vector>
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型vector
     * @return int整型
     */
    int maxProduct(vector<int>& nums) {
        // write code here
        if (nums.size() == 1) {
            return nums[0];
        }
        vector<int>path;
        vector<vector<int>>nonezero_nums_vec;
        int result = INT_MIN;
	  //将数组从左到右切片,确保每一个切片都不含0且连续
        for (int i = 0; i < nums.size(); i++) {
            if (nums[i] == 0) {
                nonezero_nums_vec.push_back(path);
                result = 0;
                path.clear();
                continue;
            } else {
                if (i == nums.size() - 1) {
                    path.push_back(nums[i]);
                    nonezero_nums_vec.push_back(path);
                } else {
                    path.push_back(nums[i]);
                }
            }
        }
        for (int i = 0; i < nonezero_nums_vec.size(); i++) {
            int temp = compute_nonzero_nums(nonezero_nums_vec[i]);
            result = max(result, temp );
        }
        return result;

    }
  //计算不含0数组中的最大乘积数组的乘积
    int compute_nonzero_nums(vector<int>& nonezero_nums) {
        if (nonezero_nums.size() == 0) {
            return 0;
        }
        else if (nonezero_nums.size()==1) {
            return nonezero_nums[0];
        }
        int result = 1;
        for (int i = 0; i < nonezero_nums.size(); i++) {
            result = result * nonezero_nums[i];
        }
        if (result > 0) {
            return result;
        } else {
            int left_first_negative_position = 0;
            int right_first_negative_position = nonezero_nums.size() - 1;
            for (int i = 0; i < nonezero_nums.size(); i++) {
                if (nonezero_nums[i] < 0) {
                    left_first_negative_position = i;
                    break;
                }
            }
            for (int j = nonezero_nums.size() - 1; j >= 0; j--) {
                if (nonezero_nums[j] < 0) {
                    right_first_negative_position = j;
                    break;
                }
            }
            int temp1 = 1;
            for (int i = left_first_negative_position + 1; i < nonezero_nums.size(); i++) {
                temp1 =  temp1 * nonezero_nums[i];
            }
            int temp2 = 1;
            for (int i = right_first_negative_position - 1; i >= 0; i--) {
                temp2 =  temp2 * nonezero_nums[i];
            }
            result = max(temp1, temp2);
        }
        return result;
    }
};

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务