zoukankan      html  css  js  c++  java
  • [Swift]LeetCode152. 乘积最大子序列 | Maximum Product Subarray

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/10057454.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    Given an integer array nums, find the contiguous subarray within an array (containing at least one number) which has the largest product.

    Example 1:

    Input: [2,3,-2,4]
    Output: 6
    Explanation: [2,3] has the largest product 6.
    

    Example 2:

    Input: [-2,0,-1]
    Output: 0
    Explanation: The result cannot be 2, because [-2,-1] is not a subarray.

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

    示例 1:

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

    示例 2:

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

    12ms
     1 class Solution {
     2     func maxProduct(_ nums: [Int]) -> Int {
     3         guard nums.count > 0 else { return 0 }
     4         
     5         var minValue = nums[0], maxValue = nums[0], finalValue = nums[0]
     6         
     7         for i in 1..<nums.count {
     8             if nums[i] > 0 {
     9                 maxValue = max(nums[i], maxValue * nums[i])
    10                 minValue = min(nums[i], minValue * nums[i])
    11             }else {
    12                 var tmp = maxValue
    13                 maxValue = max(nums[i], minValue * nums[i])
    14                 minValue = min(nums[i], tmp * nums[i])
    15             }
    16             finalValue = max(finalValue, maxValue)
    17         }
    18         
    19         return finalValue
    20     }
    21 }

    16ms

     1 class Solution {
     2     func maxProduct(_ nums: [Int]) -> Int {
     3         return getResult(nums)
     4     }
     5     
     6    private func getResult(_ array: [Int]) -> Int {
     7         var result = array[0]
     8         var previousMin = array[0]
     9         var previousMax = array[0]
    10         var currentMin = array[0]
    11         var currentMax = array[0]
    12 
    13         for el in array.dropFirst() {
    14             currentMax = max(max(previousMax * el, previousMin * el), el)
    15             currentMin = min(min(previousMax * el, previousMin * el), el)
    16             result = max(currentMax, result)
    17             previousMax = currentMax
    18             previousMin = currentMin
    19         }
    20 
    21         return result
    22     }
    23 }

    28ms

     1 class Solution {
     2     func maxProduct(_ nums: [Int]) -> Int {
     3         guard !nums.isEmpty else { return 0 }
     4 
     5         var ret = nums.first!
     6         var (iMin, iMax) = (nums.first!, nums.first!)
     7 
     8         for n in nums.dropFirst() {
     9             if n < 0 {
    10                 (iMin, iMax) = (iMax, iMin)
    11             }
    12 
    13             iMin = min(n, iMin * n)
    14             iMax = max(n, iMax * n)
    15 
    16             ret = max(ret, iMax)
    17         }
    18 
    19         return ret
    20     }
    21 }

    32ms

     1 class Solution {
     2 
     3     func maxProduct(_ nums: [Int]) -> Int {
     4         guard nums.count > 0 else {
     5             return 0
     6         }
     7         
     8         var minimum = 1
     9         var maximum = 1
    10         var oldMax = maximum
    11         var globalMax = nums[0]
    12         
    13         for num in nums {
    14             if num < 0 {
    15                 oldMax = maximum
    16                 maximum = max(num, minimum*num)
    17                 minimum = min(num, oldMax*num)
    18             } else {
    19                 maximum = max(num, maximum*num)
    20                 minimum = min(num, minimum*num)
    21             }
    22             globalMax = max(globalMax, maximum)
    23         }
    24         
    25         return globalMax
    26     }
    27 }

    36ms

     1 class Solution {
     2     func maxProduct(_ nums: [Int]) -> Int {
     3         var lhs = 1
     4         var rhs = 1
     5         var maxhs = nums[0]
     6         
     7         for i in 0..<nums.count {
     8             lhs *= nums[i]
     9             rhs *= nums[nums.count - i - 1]
    10             maxhs = max(maxhs, lhs, rhs)
    11             
    12             if lhs == 0 { lhs = 1}
    13             if rhs == 0 { rhs = 1}
    14             
    15         }
    16         return maxhs
    17     }
    18 }

    40ms

     1 class Solution {
     2     func maxProduct(_ nums: [Int]) -> Int {
     3         guard nums.count > 0 else {
     4             return 0
     5         }
     6 
     7         var maxN = nums[0], maxT = 1, minT = 1
     8         for i in 0..<nums.count {
     9             let tmp1 = maxT * nums[i]
    10             let tmp2 = minT * nums[i]
    11             maxN = max(maxN, tmp1, tmp2)
    12             maxT = max(tmp1, tmp2, 1)
    13             minT = min(tmp1, tmp2, 1)
    14         }
    15         return maxN
    16     }
    17 }
  • 相关阅读:
    洛谷P2894 [USACO08FEB]酒店Hotel
    codevs 3981 动态最大子段和
    舞蹈家怀特先生(线型)
    IOS8 通知中心(Notification Center)新特性
    WWDC2014 IOS8 APP Extensions
    IOS8 TouchID使用介绍
    IOS8 UIAlertController 弹框
    Unable to run Kiwi tests on iOS8 device
    registerForRemoteNotificationTypes: is not supported in iOS 8.0 and later
    iOS开发---- 开发错误汇总及解决方法
  • 原文地址:https://www.cnblogs.com/strengthen/p/10057454.html
Copyright © 2011-2022 走看看