Table: Products
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| product_id | int |
| low_fats | enum |
| recyclable | enum |
+-------------+---------+
product_id is the primary key (column with unique values) for this table.
low_fats is an ENUM (category) of type ('Y', 'N') where 'Y' means this product is low fat and 'N' means it is not.
recyclable is an ENUM (category) of types ('Y', 'N') where 'Y' means this product is recyclable and 'N' means it is not.
Write a solution to find the ids of products that are both low fat and recyclable.
Return the result table in any order.
The result format is in the following example.
Example 1:
Input: Products table: +-------------+----------+------------+ | product_id | low_fats | recyclable | +-------------+----------+------------+ | 0 | Y | N | | 1 | Y | Y | | 2 | N | Y | | 3 | Y | Y | | 4 | N | N | +-------------+----------+------------+ Output: +-------------+ | product_id | +-------------+ | 1 | | 3 | +-------------+ Explanation: Only products 1 and 3 are both low fat and recyclable.
Problem Overview: You are given a Products table containing product_id, low_fats, and recyclable. The task is straightforward: return the IDs of products that are marked as both low fat ('Y') and recyclable ('Y'). This is primarily a filtering problem where you scan records and keep only those matching both conditions.
Approach 1: SQL Filtering Approach (O(n) time, O(1) space)
The most direct solution uses a SQL WHERE clause to filter rows that satisfy both constraints. The query scans the Products table and checks whether low_fats = 'Y' and recyclable = 'Y'. Databases are optimized for this type of filtering, so the engine performs a single pass through the dataset (or uses indexes if available). This approach is ideal when solving the problem directly in SQL or preparing for database-focused interviews involving database queries.
Approach 2: Programmatic Filtering Approach (O(n) time, O(1) space)
If the dataset is represented as objects or rows in application code, iterate through the collection once and check the two attributes for each product. For every entry, evaluate whether both flags equal 'Y'. If the condition holds, append the product_id to the result list. This approach mirrors the SQL filter but is implemented in languages like Python or Java. It relies on a simple linear scan, making it efficient and easy to implement.
Approach 3: Using Hash Maps (O(n) time, O(n) space)
A hash map can store product IDs grouped by their attributes. As you iterate through the dataset, insert entries based on their low_fats and recyclable status. After building the structure, retrieve the IDs that fall into the category where both values are 'Y'. This method is usually unnecessary for this problem but demonstrates how attribute-based grouping can be implemented with constant-time lookups.
Approach 4: Sorting and Counting (O(n log n) time, O(1) extra space)
Another theoretical approach sorts records based on their attribute values so that similar combinations appear together. After sorting, scan the array and collect IDs belonging to the ('Y','Y') group. Sorting introduces an extra O(n log n) cost, so it is less efficient than direct filtering. However, it can be useful when working with datasets that must be ordered for other operations or when applying techniques from sorting algorithms.
Recommended for interviews: The SQL filtering approach is the expected solution for database problems. It demonstrates that you understand how to use conditional filtering in queries and how relational databases process data. The programmatic linear scan is the equivalent approach when solving the problem in a general-purpose language. Brute-force scanning shows basic reasoning, but recognizing that a single-pass filter solves the problem optimally demonstrates practical engineering judgment.
In this approach, we use a SQL query to select the desired products directly from the database. We utilize the powerful SELECT statement combined with a WHERE clause to filter the rows that meet our conditions. Specifically, we look for rows where both the low_fats column and the recyclable column are equal to 'Y'. This is a simple yet efficient method to retrieve the data required.
The SQL solution involves a straightforward SELECT statement. We select the product_id from the table Products where the columns low_fats and recyclable both have values 'Y'. Simply, we filter our table to get only those entries that meet both conditions.
SQL
The time complexity of this SQL query is O(n), where n is the number of rows in the table, because it needs to scan through each row to check the conditions. The space complexity is O(1), assuming the result set fits into memory.
Another approach is to simulate the operation in a procedural programming language. We would read a list of products representing rows from the table and filter this list programmatically. For each product, we check the conditions of being low fat and recyclable. This approach is helpful in scenarios where you deal with data outside databases or wish to manipulate and filter datasets directly in your code.
In the Python approach, we define a list of dictionaries where each dictionary represents a product. We then use a list comprehension to filter products that have both low_fats and recyclable set to 'Y'. We iterate over the list, apply our conditions, and collect the product IDs that fulfill them.
Python
Time complexity is O(n), where n is the number of products, as it involves scanning through each product. The space complexity is also O(n), since we store a portion of the original list in memory when we filter it.
This C program uses a simple hash table to count the frequency of each element in a given set of keys. The hash function modulates the key by the table size to find an index. We then increment the count at the hashtable index corresponding to each key.
Time Complexity: O(n), as we traverse the input data once.
Space Complexity: O(1) to O(n), as the space used by the hash table can be considered constant in terms of input size if limited by TABLE_SIZE.
This C program sorts the array using qsort and then counts frequencies of sorted elements. It prints the element and its count whenever a new number is encountered in the sorted list.
Time Complexity: O(n log n) due to sorting.
Space Complexity: O(1) if in-place sorting is used, otherwise O(n) if additional space is required for sorting.
We can directly filter the product IDs where low_fats is Y and recyclable is Y.
| Approach | Complexity |
|---|---|
| SQL Filtering Approach | The time complexity of this SQL query is O(n), where n is the number of rows in the table, because it needs to scan through each row to check the conditions. The space complexity is O(1), assuming the result set fits into memory. |
| Programmatic Filtering Approach | Time complexity is O(n), where n is the number of products, as it involves scanning through each product. The space complexity is also O(n), since we store a portion of the original list in memory when we filter it. |
| Approach 1: Using Hash Maps | Time Complexity: O(n), as we traverse the input data once. |
| Approach 2: Sorting and Counting | Time Complexity: O(n log n) due to sorting. |
| Conditional Filtering | — |
| Approach | Time | Space | When to Use |
|---|---|---|---|
| SQL Filtering Approach | O(n) | O(1) | Best for database queries where filtering rows with conditions is required |
| Programmatic Filtering | O(n) | O(1) | When processing product records in application code |
| Hash Map Grouping | O(n) | O(n) | Useful when grouping products by attributes for multiple lookups |
| Sorting and Counting | O(n log n) | O(1) | When records must be ordered before processing |
1. SQL LeetCode | Recyclable and Low Fat Products • Start Practicing • 85,570 views views
Watch 9 more video solutions →Practice Recyclable and Low Fat Products with our built-in code editor and test cases.
Practice on FleetCode