1. Generate All Non-Empty Subsets
Intuition
Recursively generate all non-empty subsets of the array, calculate the product for each, and track the minimum.
Algorithm
- Step 1: Initialize minProd = infinity.
- Step 2: Define backtrack(idx, currentProd, hasElement).
- Step 3: At each index, branch into including a[idx] or excluding a[idx].
- Step 4: Update minProd when hasElement is true.
- Step 5: Return minProd.
#include <iostream>#include <vector>#include <algorithm> using namespace std; class Solution { long long minProd = 1e18; void backtrack(int idx, long long currentProd, bool taken, const vector<int>& a) { if (idx == a.size()) { if (taken) minProd = min(minProd, currentProd); return; } // Exclude backtrack(idx + 1, currentProd, taken, a); // Include long long nextProd = taken ? currentProd * a[idx] : a[idx]; backtrack(idx + 1, nextProd, true, a); }public: long long minProductSubset(vector<int>& a) { minProd = 1e18; backtrack(0, 1, false, a); return minProd; }}; int main() { Solution sol; vector<int> a = {-1, -1, -2, 4, 3}; cout << "Min Product: " << sol.minProductSubset(a) << endl; return 0;}Time & Space Complexity
- Time complexity:
O(2^N) - Space complexity:
O(N)