g1001_1100.s1049_last_stone_weight_ii.Solution Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of leetcode-in-java21 Show documentation
Show all versions of leetcode-in-java21 Show documentation
Java-based LeetCode algorithm problem solutions, regularly updated
package g1001_1100.s1049_last_stone_weight_ii;
// #Medium #Array #Dynamic_Programming #2022_02_28_Time_2_ms_(95.98%)_Space_41.8_MB_(31.51%)
/**
* 1049 - Last Stone Weight II\.
*
* Medium
*
* You are given an array of integers `stones` where `stones[i]` is the weight of the ith
stone.
*
* We are playing a game with the stones. On each turn, we choose any two stones and smash them together. Suppose the stones have weights `x` and `y` with `x <= y`. The result of this smash is:
*
* * If `x == y`, both stones are destroyed, and
* * If `x != y`, the stone of weight `x` is destroyed, and the stone of weight `y` has new weight `y - x`.
*
* At the end of the game, there is **at most one** stone left.
*
* Return _the smallest possible weight of the left stone_. If there are no stones left, return `0`.
*
* **Example 1:**
*
* **Input:** stones = [2,7,4,1,8,1]
*
* **Output:** 1
*
* **Explanation:**
*
* We can combine 2 and 4 to get 2, so the array converts to [2,7,1,8,1] then,
*
* we can combine 7 and 8 to get 1, so the array converts to [2,1,1,1] then,
*
* we can combine 2 and 1 to get 1, so the array converts to [1,1,1] then,
*
* we can combine 1 and 1 to get 0, so the array converts to [1], then that's the optimal value.
*
* **Example 2:**
*
* **Input:** stones = [31,26,33,21,40]
*
* **Output:** 5
*
* **Constraints:**
*
* * `1 <= stones.length <= 30`
* * `1 <= stones[i] <= 100`
**/
public class Solution {
public int lastStoneWeightII(int[] stones) {
// dp[i][j] i is the index of stones, j is the current weight
// goal is to find max closest to half and use it to get the diff
// 0-1 knapsack problem
int sum = 0;
for (int stone : stones) {
sum += stone;
}
int half = sum / 2;
int[] dp = new int[half + 1];
for (int cur : stones) {
for (int j = half; j >= cur; j--) {
dp[j] = Math.max(dp[j], dp[j - cur] + cur);
}
}
return sum - dp[half] * 2;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy