|
24 | 24 |
|
25 | 25 | <!-- 这里可写通用的实现逻辑 -->
|
26 | 26 |
|
| 27 | +考虑当前位置 i: |
| 28 | + |
| 29 | +- 如果是一个负数的话,那么我们希望以它前一个位置结尾的某个段的积也是个负数,这样可以负负得正,并且我们希望这个积尽可能「负得更多」,即尽可能小。 |
| 30 | +- 如果是一个正数的话,我们更希望以它前一个位置结尾的某个段的积也是个正数,并且希望它尽可能地大。 |
| 31 | + |
| 32 | +因此,分别维护 fmax 和 fmin。 |
| 33 | + |
| 34 | +- `fmax(i) = max(nums[i], fmax(i - 1) * nums[i], fmin(i - 1) * nums[i])` |
| 35 | +- `fmin(i) = min(nums[i], fmax(i - 1) * nums[i], fmin(i - 1) * nums[i])` |
| 36 | +- `res = max(fmax(i)), i∈[0, n)` |
| 37 | + |
27 | 38 | <!-- tabs:start -->
|
28 | 39 |
|
29 | 40 | ### **Python3**
|
30 | 41 |
|
31 | 42 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
32 | 43 |
|
33 | 44 | ```python
|
34 |
| - |
| 45 | +class Solution: |
| 46 | + def maxProduct(self, nums: List[int]) -> int: |
| 47 | + maxf = minf = nums[0] |
| 48 | + res, n = nums[0], len(nums) |
| 49 | + for i in range(1, n): |
| 50 | + p, q = maxf, minf |
| 51 | + maxf = max(nums[i], p * nums[i], q * nums[i]) |
| 52 | + minf = min(nums[i], p * nums[i], q * nums[i]) |
| 53 | + res = max(res, maxf) |
| 54 | + return res |
35 | 55 | ```
|
36 | 56 |
|
37 | 57 | ### **Java**
|
38 | 58 |
|
39 | 59 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
40 | 60 |
|
41 | 61 | ```java
|
42 |
| - |
| 62 | +class Solution { |
| 63 | + public int maxProduct(int[] nums) { |
| 64 | + int maxf = nums[0], minf = nums[0]; |
| 65 | + int res = nums[0], n = nums.length; |
| 66 | + for (int i = 1; i < n; ++i) { |
| 67 | + int p = maxf, q = minf; |
| 68 | + maxf = Math.max(nums[i], Math.max(p * nums[i], q * nums[i])); |
| 69 | + minf = Math.min(nums[i], Math.min(p * nums[i], q * nums[i])); |
| 70 | + res = Math.max(res, maxf); |
| 71 | + } |
| 72 | + return res; |
| 73 | + } |
| 74 | +} |
43 | 75 | ```
|
44 | 76 |
|
45 | 77 | ### **...**
|
|
0 commit comments