import java.util.*; /** * NC306 乘积为正数的最长连续子数组 * @author d3y1 */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型ArrayList * @return int整型 */ public int findLongestSubArray (ArrayList<Integer> nums) { return solution(nums); } /** * 动态规划 * * dp[i][0]表示以数组中第i个整数为结尾的子数组的乘积为负数的最长长度 * dp[i][1]表示以数组中第i个整数为结尾的子数组的乘积为正数的最长长度 * * num: 数组中第i个整数 * * 1. num>0时: * { dp[i-1][0] + 1 , dp[i-1][0] > 0 * dp[i][0] = { * { 0 , dp[i-1][0] = 0 * dp[i][1] = dp[i-1][1] + 1 * * 2. num<0时: * dp[i][0] = dp[i-1][1] + 1 * { dp[i-1][0] + 1 , dp[i-1][0] > 0 * dp[i][1] = { * { 0 , dp[i-1][0] = 0 * * 3. num=0时: * dp[i][0] = 0 * dp[i][1] = 0 * * @param nums * @return */ private int solution(ArrayList<Integer> nums){ int n = nums.size(); int[][] dp = new int[n+1][2]; int num; int len = 0; for(int i=1; i<=n; i++){ num = nums.get(i-1); if(num > 0){ if(dp[i-1][0] > 0){ dp[i][0] = dp[i-1][0] + 1; } dp[i][1] = dp[i-1][1] + 1; } if(num < 0){ dp[i][0] = dp[i-1][1] + 1; if(dp[i-1][0] > 0){ dp[i][1] = dp[i-1][0] + 1; } } len = Math.max(len, dp[i][1]); } return len; } }