给定一个长度为 n 的整数数组,请你找出其中最长的乘积为正数的子数组长度。
子数组的定义是原数组中一定长度的连续数字组成的数组。
数据范围:
, 数组中的元素满足
public class Solution { public int findLongestSubArray (List<Integer> nums) { int res = 0; int[] dp = new int[nums.size()]; dp[0] = nums.get(0) > 0 ? 1 : 0; for (int i = 1; i < nums.size(); i++) { if (nums.get(i) > 0) { // 正数 dp[i] = dp[i-1] + 1; } else if (nums.get(i) < 0) { // 负数 int pre = i-dp[i-1]-1; if (pre >= 0 && nums.get(pre) < 0) { // 前推存在负数 dp[i] = dp[i-1] + 2; if (pre-1 >= 0) { // 补上前面剩下的 dp[i] += dp[pre-1]; } } } res = Math.max(dp[i], res); } return res; } }
public int findLongestSubArray (ArrayList<Integer> nums) { // write code here int[][] dp = new int[nums.size()][2]; int ans = 0; if(nums.get(0) > 0) { dp[0][0] = 1; ans = 1; } else if(nums.get(0) < 0) { dp[0][1] = 1; } for(int i = 1; i < nums.size(); ++i) { if(nums.get(i) > 0) { dp[i][0] = dp[i-1][0] + 1; dp[i][1] = dp[i-1][1] == 0 ? 0 : dp[i-1][1] + 1; } else if(nums.get(i) < 0) { dp[i][0] = dp[i-1][1] == 0 ? 0 : dp[i-1][1] + 1; dp[i][1] = dp[i-1][0] + 1; } else { dp[i][0] = dp[i][1] = 0; } ans = Math.max(ans, dp[i][0]); } return ans; }