日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

【LeetCode笔记】152. 乘积最大子数组(Java、动态规划)

發布時間:2024/7/23 java 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【LeetCode笔记】152. 乘积最大子数组(Java、动态规划) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 題目描述
  • 思路 & 代碼
      • 更新版

題目描述

  • 考慮正數、負數和0的情況

思路 & 代碼

  • 既然是使用的動態規劃,那么有以下幾點:
  • 維護什么:維護iMax和iMin,分別代表包含當前值的子數組的最大乘積 & 最小乘積
  • 什么時候轉移:負數(iMax & iMin互換)
  • 0的時候呢?由于乘積怎么都是0,所以直接iMax = iMin = 0就行
  • 每次循環都讓 max = Math.max(iMax, iMin)
  • 為什么可以得到最大值?因為在循環中,iMax肯定在某次循環中取到了最大值,證明可由代碼分析得到。
  • class Solution {public int maxProduct(int[] nums) {// max:最大值// imax:包含nums[i]的子數組最大乘積// imin:包含nums[i]的子數組最小乘積int max = Integer.MIN_VALUE;int imax = 1,imin = 1;for(int i=0;i < nums.length;i++){// 小于0的情況,交換imax 和 imin(正負互換)// 保持 imax 一定比 imin 大if(nums[i] < 0){int temp = imax;imax = imin;imin = temp;}// 保證 imax、imin一定是包含nums[i]在內的最大、最小值imax = Math.max(imax * nums[i],nums[i]);imin = Math.min(imin * nums[i],nums[i]);max = Math.max(max,imax);}return max;} }

    更新版

    • 重做一遍,做不出來了= =
    • 還是得記住核心思路:記錄 iMax、iMin,根據新元素決定是否交換、以及甩掉前值
    class Solution {public int maxProduct(int[] nums) {int max = nums[0];int iMax = 1, iMin = 1;for(int num : nums) {if(num < 0) {int temp = iMax;iMax = iMin;iMin = temp;}iMin = Math.min(iMin * num, num);iMax = Math.max(iMax * num, num);max = Math.max(iMax, max);}return max;} } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的【LeetCode笔记】152. 乘积最大子数组(Java、动态规划)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。