【每日一題-leetcode】416. 分割等和子集

qxlxi發表於2020-10-04

416. 分割等和子集

難度中等421

給定一個只包含正整數的非空陣列。是否可以將這個陣列分割成兩個子集,使得兩個子集的元素和相等。

注意:

  1. 每個陣列中的元素不會超過 100
  2. 陣列的大小不會超過 200

示例 1:

輸入: [1, 5, 11, 5]

輸出: true

解釋: 陣列可以分割成 [1, 5, 5] 和 [11].
//先計算總和 如何是奇數說明不可能進行分隔,直接返回false
//dp 1.找到重複子問題 2.dp狀態定義與選擇 3.dp方程
//對於每個數只能選舉一次,所以 只需要進行一次遍歷
//w 是最大值 
public boolean canPartition(int[] nums) {
    int sum = computeArraySum(nums);
    if (sum % 2 != 0) {
        return false;
    }
    int w = sum/2;
    boolean [] dp = new boolean[w+1];
    dp[0] = true;
    for (int num : nums) {
        for (int i=w; i>=num ;i--) { 
            dp[i] = dp[i] || dp[i-num];
        }
    }
    return dp[w];
}

private int computeArraySum(int [] nums) {
    int sum = 0;
    for (int num :nums) {
        sum+=num;
    }
    return sum;
}

相關文章