소스 검색

#feat:leetcode p152题题解

yangyi 2 주 전
부모
커밋
9cc4dcfa8d
2개의 변경된 파일95개의 추가작업 그리고 0개의 파일을 삭제
  1. 53 0
      src/leetcode/p152/Solution.java
  2. 42 0
      src/leetcode/p152/SolutionTest.java

+ 53 - 0
src/leetcode/p152/Solution.java

@@ -0,0 +1,53 @@
+package leetcode.p152;
+
+/**
+ * @ProjectName: LeetCode
+ * @FileName: Solution
+ * @Author: 杨逸
+ * @Data:2026/3/24 20:19
+ * @Description: https://leetcode.cn/problems/maximum-product-subarray/description/
+ * 152. 乘积最大子数组
+ */
+public class Solution {
+    public int maxProduct(int[] nums) {
+        /**
+         * 递推
+         * dp[i][1]表示以第i个元素结尾的最大乘积,因为有负数可能出现负负得正的情况,所以需要维护最小值
+         * 每一次可以选择续子数组或者从新开始(选大者)
+         * 维护出现的最大值就是答案
+         */
+        int pre_min = 1;
+        int pre_max = 1;
+        int ans = Integer.MIN_VALUE;
+        for (int i = 0; i < nums.length; i++) {
+            int min = Math.min(nums[i],Math.min(pre_min * nums[i], pre_max * nums[i]));
+            int max = Math.max(nums[i],Math.max(pre_min * nums[i], pre_max * nums[i]));
+            pre_min = min;
+            pre_max = max;
+            ans = Math.max(ans, max);
+        }
+        return ans;
+    }
+    private int dp(int[] nums){
+        /**
+         * 动态规划(递推)
+         * dp[i][1]表示以第i个元素结尾的最大乘积,因为有负数可能出现负负得正的情况,所以需要维护最小值
+         * 每一次可以选择续子数组或者从新开始(选大者)
+         * 维护出现的最大值就是答案
+         */
+        int[][] dp = new int[nums.length][2];
+        dp[0][0] = nums[0];
+        dp[0][1] = nums[0];
+        //int min = dp[0][0];
+        //int max = dp[0][1];
+        int ans = dp[0][1];
+        for (int i = 1; i < nums.length; i++) {
+            int min = Math.min(nums[i],Math.min(dp[i - 1][0] * nums[i], dp[i - 1][1] * nums[i]));
+            int max = Math.max(nums[i],Math.max(dp[i - 1][0] * nums[i], dp[i - 1][1] * nums[i]));
+            dp[i][0] = min;
+            dp[i][1] = max;
+            ans = Math.max(ans, max);
+        }
+        return ans;
+    }
+}

+ 42 - 0
src/leetcode/p152/SolutionTest.java

@@ -0,0 +1,42 @@
+package leetcode.p152;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * @ProjectName: LeetCode
+ * @FileName: SolutionTest
+ * @Author: 杨逸
+ * @Data:2026/3/24 20:32
+ * @Description:
+ */
+@RunWith(Parameterized.class)
+public class SolutionTest {
+    public static final Solution solution = new Solution();
+    private final int[] nums;
+    private final int expected;
+
+    public SolutionTest(int[] nums, int expected) {
+        this.nums = nums;
+        this.expected = expected;
+    }
+    @Parameterized.Parameters
+    public static Collection<Object[]> data() {
+        return Arrays.asList(new Object[][]{
+                {new int[]{2,3,-2,4},6},
+                {new int[]{-2,0,-1},0},
+                {new int[]{-2,3,-4},24},
+        });
+    }
+
+    @Test
+    public void maxProduct() {
+        assertEquals(expected, solution.maxProduct(nums));
+    }
+}