题目链接

乘积为正数的最长子数组长度

题目描述

image.png

实现代码

思路:即dp[i]表示以第i个位置结尾的字符串对应的最长子数组,需要考虑nums[i]为正数和负数的情况;

当nums[i]为正数时,我们应该找第i-1个位置结尾的字符串对应的乘积为负数的最长子数组和;
当nums[i]为负数时,我们应该找第i-1个位置结尾的字符串对应的乘积为整数的最长子数组和;
当nums[i]为0时,值应该为0;因为无论前面是什么,以该位置结尾的值都是0;

因此,我们可以通过positive[i]和negative[i]两个数组分别记录以第i个位置结尾的字符串对应的乘积为正数和负数的最长子数组长度;实现代码如下:

  1. class Solution {
  2. public int getMaxLen(int[] nums) {
  3. int length = nums.length;
  4. int positive = nums[0] > 0 ? 1 : 0;
  5. int negative = nums[0] < 0 ? 1 : 0;
  6. int maxLength = positive;
  7. for (int i = 1; i < length; i++) {
  8. if (nums[i] > 0) {
  9. positive++;
  10. negative = negative > 0 ? negative + 1 : 0;
  11. } else if (nums[i] < 0) {
  12. int newPositive = negative > 0 ? negative + 1 : 0;
  13. int newNegative = positive + 1;
  14. positive = newPositive;
  15. negative = newNegative;
  16. } else {
  17. positive = 0;
  18. negative = 0;
  19. }
  20. maxLength = Math.max(maxLength, positive);
  21. }
  22. return maxLength;
  23. }
  24. }