题目
解答
public class Solution {
public int maxProduct(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
if (nums.length == 1) {
return nums[0];
}
int max = nums[0];
int min = nums[0];
int res = nums[0];
for (int i = 1; i < nums.length; i++) {
int tmp = max;
max = Math.max(nums[i], Math.max(nums[i] * max, nums[i] * min));
min = Math.min(nums[i], Math.min(nums[i] * tmp, nums[i] * min));
res = Math.max(res, max);
}
return res;
}
}
要点
求解乘积的最大子序列时,需要关注正、负号对结果的影响,关注点有:
因此在求解过程中,不能只记录最大值,需要同时记录最小值。
设计用例时,对照上述关注点,可以输出如下用例:
@Before
public void before() {
t = new Solution();
}
@Test
public void test001() {
assertEquals(6, t.maxProduct(new int[] { 2, 3, -2, 4 }));
}
@Test
public void test001001() {
assertEquals(24, t.maxProduct(new int[] { -2, 2, 3, 4 }));
}
@Test
public void test001002() {
assertEquals(12, t.maxProduct(new int[] { -2, 2, 0, 3, 4 }));
}
@Test
public void test001003() {
assertEquals(4, t.maxProduct(new int[] { -2, 2, 0, 3, 0, 4 }));
}
@Test
public void test002() {
assertEquals(0, t.maxProduct(new int[] { -2, 0, -1 }));
}
@Test
public void test003() {
assertEquals(24, t.maxProduct(new int[] { -2, 3, -4 }));
}
@Test
public void test003001() {
assertEquals(24, t.maxProduct(new int[] { 0, -2, 3, -4 }));
}
@Test
public void test003002() {
assertEquals(3, t.maxProduct(new int[] { -2, 0, 3, -4 }));
}
@Test
public void test003003() {
assertEquals(12, t.maxProduct(new int[] { -2, -3, -4 }));
}
@Test
public void test003004() {
assertEquals(24, t.maxProduct(new int[] { -2, -3, 4 }));
}
@Test
public void test003005() {
assertEquals(12, t.maxProduct(new int[] { -2, 0, -3, -4 }));
}