阅读量:0
一、分割等和子集
给你一个 只包含正整数 的 非空 数组 nums
。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
class Solution { public boolean canPartition(int[] nums) { //1.首先判断数组是否可以均分为两份 int n = nums.length, sum = 0; for (int i : nums) { sum += i; } if (sum % 2 != 0) return false; //2.若可以,以平均数为目标值 int target = sum / 2; int[] dp = new int[target + 1]; for (int i = 0; i < n; i++) { for (int j = target; j >= nums[i]; j--) { dp[j] = Math.max (dp[j],dp[j-nums[i]] + nums[i]); } if (dp[target] == target) return true; } return dp[target] == target; } }
二、乘积最大子数组
给你一个整数数组 nums
,请你找出数组中乘积最大的非空连续
子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
测试用例的答案是一个 32-位 整数。
class Solution { public int maxProduct(int[] nums) { int product = 1, n = nums.length; int max = nums[0]; for(int i = 0;i < n;i++){ product *= nums[i]; max = Math.max(max, product); if(nums[i] == 0){ product = 1; } } product = 1; for(int i = n - 1;i >= 0;i--){ product *= nums[i]; max = Math.max(max, product); if(nums[i] == 0){ product = 1; } } return max; } }