LeetCode: 416. Suma de subconjuntos iguales de particiones: análisis y código (Java)

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.

Supongo que te gusta

Origin blog.csdn.net/zml66666/article/details/103431360
Recomendado
Clasificación