🧠
Brute Force (Pure Recursion)
💡 Brute force helps understand the problem by exploring all possible partitions of stones into two groups, but it is inefficient due to exponential time complexity.
Intuition
Try all ways to assign each stone to one of two piles and compute the minimal difference of their sums.
Algorithm
- Define a recursive function that tries placing each stone in either of two subsets.
- At each step, recurse with updated sums for both subsets.
- When all stones are assigned, compute the absolute difference of sums.
- Return the minimal difference found among all assignments.
💡 This approach is conceptually simple but inefficient because it explores all 2^n assignments.
Recurrence:f(i, sum1, sum2) = min(f(i+1, sum1 + stones[i], sum2), f(i+1, sum1, sum2 + stones[i]))
def lastStoneWeightII(stones):
n = len(stones)
def dfs(i, sum1, sum2):
if i == n:
return abs(sum1 - sum2)
left = dfs(i + 1, sum1 + stones[i], sum2)
right = dfs(i + 1, sum1, sum2 + stones[i])
return min(left, right)
return dfs(0, 0, 0)
# Driver code
if __name__ == '__main__':
stones = [2,7,4,1,8,1]
print(lastStoneWeightII(stones))
Line Notes
def dfs(i, sum1, sum2):Defines recursive helper to explore subsets
if i == n:Base case: all stones assigned
return abs(sum1 - sum2)Compute difference when all stones assigned
left = dfs(i + 1, sum1 + stones[i], sum2)Assign current stone to first subset
right = dfs(i + 1, sum1, sum2 + stones[i])Assign current stone to second subset
return min(left, right)Choose minimal difference from both assignments
import java.util.*;
public class Solution {
public int lastStoneWeightII(int[] stones) {
return dfs(stones, 0, 0, 0);
}
private int dfs(int[] stones, int i, int sum1, int sum2) {
if (i == stones.length) {
return Math.abs(sum1 - sum2);
}
int left = dfs(stones, i + 1, sum1 + stones[i], sum2);
int right = dfs(stones, i + 1, sum1, sum2 + stones[i]);
return Math.min(left, right);
}
public static void main(String[] args) {
Solution sol = new Solution();
int[] stones = {2,7,4,1,8,1};
System.out.println(sol.lastStoneWeightII(stones));
}
}
Line Notes
public int lastStoneWeightII(int[] stones)Entry point for solution
if (i == stones.length)Base case: all stones assigned
return Math.abs(sum1 - sum2)Calculate difference at leaf
int left = dfs(...)Assign stone to first subset
int right = dfs(...)Assign stone to second subset
return Math.min(left, right)Choose minimal difference
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
class Solution {
public:
int lastStoneWeightII(vector<int>& stones) {
return dfs(stones, 0, 0, 0);
}
private:
int dfs(vector<int>& stones, int i, int sum1, int sum2) {
if (i == stones.size()) {
return abs(sum1 - sum2);
}
int left = dfs(stones, i + 1, sum1 + stones[i], sum2);
int right = dfs(stones, i + 1, sum1, sum2 + stones[i]);
return min(left, right);
}
};
int main() {
Solution sol;
vector<int> stones = {2,7,4,1,8,1};
cout << sol.lastStoneWeightII(stones) << endl;
return 0;
}
Line Notes
int dfs(vector<int>& stones, int i, int sum1, int sum2)Recursive helper exploring subsets
if (i == stones.size())Base case: all stones assigned
return abs(sum1 - sum2)Calculate difference at leaf
int left = dfs(...)Assign stone to first subset
int right = dfs(...)Assign stone to second subset
return min(left, right)Choose minimal difference
function lastStoneWeightII(stones) {
const n = stones.length;
function dfs(i, sum1, sum2) {
if (i === n) return Math.abs(sum1 - sum2);
const left = dfs(i + 1, sum1 + stones[i], sum2);
const right = dfs(i + 1, sum1, sum2 + stones[i]);
return Math.min(left, right);
}
return dfs(0, 0, 0);
}
// Test
console.log(lastStoneWeightII([2,7,4,1,8,1]));
Line Notes
function dfs(i, sum1, sum2)Recursive helper to explore subsets
if (i === n)Base case: all stones assigned
return Math.abs(sum1 - sum2)Calculate difference at leaf
const left = dfs(...)Assign stone to first subset
const right = dfs(...)Assign stone to second subset
return Math.min(left, right)Choose minimal difference
TimeO(2^n)
SpaceO(n) due to recursion stack
Each stone has two choices, leading to 2^n combinations.
💡 For n=20, this means over a million calls, which is impractical.
Interview Verdict: TLE
This approach is too slow for large inputs but is essential to understand the problem structure.