From 3a82396c0755d0a97b2641446b88140f0a6e67e4 Mon Sep 17 00:00:00 2001 From: Cool <747682928@qq.com> Date: Thu, 26 Sep 2024 00:41:34 +0800 Subject: [PATCH] 2024/9/26 LeetCode Hot100 dp --- src/main/java/com/cool/hot100/dp/Num152.java | 79 ++++++++++++++++++++ src/main/java/com/cool/hot100/dp/Num300.java | 50 +++++++++++++ 2 files changed, 129 insertions(+) create mode 100644 src/main/java/com/cool/hot100/dp/Num152.java diff --git a/src/main/java/com/cool/hot100/dp/Num152.java b/src/main/java/com/cool/hot100/dp/Num152.java new file mode 100644 index 0000000..5c37b7d --- /dev/null +++ b/src/main/java/com/cool/hot100/dp/Num152.java @@ -0,0 +1,79 @@ +package com.cool.hot100.dp; + +import org.junit.Test; + +/** + * Created with IntelliJ IDEA. + * + * @Author: Cool + * @Date: 2024/09/25/23:23 + * @Description: 152. 乘积最大子数组 + * Level 4 + * DayNumber 4 + * Hard 2 + * @Link https://leetcode.cn/problems/maximum-product-subarray/description/?envType=study-plan-v2&envId=top-100-liked + */ +public class Num152 { + + public int maxProduct(int[] nums) { + int length = nums.length; + long[] maxF = new long[length]; + long[] minF = new long[length]; + for (int i = 0; i < length; i++) { + maxF[i] = nums[i]; + minF[i] = nums[i]; + } + for (int i = 1; i < length; ++i) { + maxF[i] = Math.max(maxF[i - 1] * nums[i], Math.max(nums[i], minF[i - 1] * nums[i])); + minF[i] = Math.min(minF[i - 1] * nums[i], Math.min(nums[i], maxF[i - 1] * nums[i])); + if (minF[i] < (-1 << 31)) { + minF[i] = nums[i]; + } + } + int ans = (int) maxF[0]; + for (int i = 1; i < length; ++i) { + ans = Math.max(ans, (int) maxF[i]); + } + return ans; + } + public int maxProduct1(int[] nums) { + int length=nums.length; + int[] maxArr=new int[length]; + int[] minArr=new int[length]; + for(int i=0;i d[len]) { + d[++len] = nums[i]; + } else { + int l = 1, r = len, pos = 0; // 如果找不到说明所有的数都比 nums[i] 大,此时要更新 d[1],所以这里将 pos 设为 0 + while (l <= r) { + int mid = (l + r) >> 1; + if (d[mid] < nums[i]) { + pos = mid; + l = mid + 1; + } else { + r = mid - 1; + } + } + d[pos + 1] = nums[i]; + } + } + return len; + } + }