LeetCode: 416. Suma de subconjunto igual de partición [Suma de subconjunto igual de partición]: análisis y código [Java]
1. Título
Dado que contiene solo un entero positivo, es una matriz no vacía . ¿Es posible dividir esta matriz en dos subconjuntos para que la suma de los elementos de los dos subconjuntos sea igual?
Nota:
Los elementos de cada matriz no excederán los 100 y
el tamaño de la matriz no excederá los 200
Ejemplo 1:
输入: [1, 5, 11, 5]
输出: true
解释: 数组可以分割成 [1, 5, 5] 和 [11].
Ejemplo 2:
输入: [1, 2, 3, 5]
输出: false
解释: 数组不能分割成两个元素和相等的子集.
Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/partition-equal-subset-sum Los
derechos de autor son propiedad de LeetCode . Para reimpresiones comerciales, comuníquese con la autorización oficial. Para reimpresiones no comerciales, indique la fuente.
Dos, análisis y código
1. Programación dinámica
(1) Pensando
La matriz se puede dividir en dos elementos y subconjuntos iguales, lo que equivale a la existencia de algunos elementos en la matriz, y la suma es la mitad de la suma de los elementos de la matriz. Por tanto, este problema puede convertirse en un problema de mochila y resolverse mediante programación dinámica.
(2) Código
class Solution {
public boolean canPartition(int[] nums) {
if (nums.length == 0)
return false;
int sum = 0;
for (int i = 0; i < nums.length; i++)
sum += nums[i];
if ((sum & 1) == 1)
return false;
sum >>= 1;
boolean[] hasSum = new boolean[sum + 1];
hasSum[0] = true;
for (int i = 1; i < sum + 1; i++)
hasSum[i] = false;
for (int i = 0; i < nums.length; i++) {
for (int j = sum; j >= 0; j--) {
if (j + nums[i] < sum + 1 && hasSum[j] == true) {
if (j + nums[i] == sum)
return true;
hasSum[j + nums[i]] = true;
}
}
}
return hasSum[sum];
}
}
(3) Resultados
Tiempo de ejecución: 11 ms, superando al 91,54% de los usuarios
en todas las presentaciones de Java ; consumo de memoria: 38 MB, superando al 78,48% de los usuarios en todas las presentaciones de Java.
Tres, otro
Nada.