一、分割等和子集
给你一个 只包含正整数 的 非空 数组 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;
}
}
7382

被折叠的 条评论
为什么被折叠?



