• LeetCode 152. 乘积最大子序列(Maximum Product Subarray)


    题目描述

    给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。

    示例 1:

    输入: [2,3,-2,4]
    输出: 6
    解释: 子数组 [2,3] 有最大乘积 6。
    

    示例 2:

    输入: [-2,0,-1]
    输出: 0
    解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

    解题思路

    利用动态规划思想,因为两个负数相乘会变成正数,所以对于每个位置要记录当前子序列的乘积最大值和最小值,这样状态转移方程为:

    maxNum = max(maxNums[i - 1] * nums[i], minNums[i - 1] * nums[i], nums[i])

    minNum = min(maxNums[i - 1] * nums[i], minNums[i - 1] * nums[i], nums[i])

    代码

     1 class Solution {
     2 public:
     3     int maxProduct(vector<int>& nums) {
     4         vector<int> maxNums(nums), minNums(nums);
     5         int res = nums[0];
     6         for(int i = 1; i < nums.size(); i++){
     7             maxNums[i] = max(maxNums[i - 1] * nums[i] < minNums[i - 1] * nums[i] ? minNums[i - 1] * nums[i] : maxNums[i - 1] * nums[i], nums[i]);
     8             minNums[i] = min(maxNums[i - 1] * nums[i] > minNums[i - 1] * nums[i] ? minNums[i - 1] * nums[i] : maxNums[i - 1] * nums[i], nums[i]);
     9             if(res < maxNums[i])
    10                 res = maxNums[i];
    11         }
    12         return res;
    13     }
    14 };
  • 相关阅读:
    3、linux网络编程--网络字节序
    1、linux网络编程--网络协议
    第四篇:进程
    第五篇:进程通信
    第六篇:线程原理
    操作系统基本概念
    第一篇:基础原理篇
    第二篇:操作系统历史
    (2)linux下的简单的socket通信实例
    (3)基于linux的socket编程TCP半双工client-server聊天程序
  • 原文地址:https://www.cnblogs.com/wmx24/p/9406204.html
Copyright © 2020-2023  润新知