{x}
blog image

The Number of Users That Are Eligible for Discount

Solution Explanation for LeetCode 2205: The Number of Users That Are Eligible for Discount

This problem requires us to find the number of users who made a purchase within a specified date range and with a minimum purchase amount. The solution involves querying a database table (Purchases).

Approach

The core idea is to filter the Purchases table based on two criteria:

  1. Time Range: The time_stamp column must fall within the provided startDate and endDate. Crucially, we treat these dates as the start of the day (00:00:00).
  2. Minimum Amount: The amount column must be greater than or equal to the minAmount.

After filtering, we need to count the unique users (user_id) who satisfy both conditions.

SQL Solution (MySQL)

The provided MySQL solution uses a stored function for better modularity and reusability.

CREATE FUNCTION getUserIDs(startDate DATE, endDate DATE, minAmount INT) RETURNS INT
BEGIN
  RETURN (
      SELECT COUNT(DISTINCT user_id) AS user_cnt
      FROM Purchases
      WHERE time_stamp BETWEEN startDate AND endDate AND amount >= minAmount
  );
END

This function, getUserIDs, takes the startDate, endDate, and minAmount as input. It then executes a SELECT statement:

  • COUNT(DISTINCT user_id): This counts the unique user_id values. Using DISTINCT ensures that each user is counted only once, even if they made multiple qualifying purchases.
  • FROM Purchases: Specifies the table to query.
  • WHERE time_stamp BETWEEN startDate AND endDate AND amount >= minAmount: This is the crucial filtering condition. It selects only rows where the timestamp is within the specified range and the amount meets the minimum requirement.

The result of this SELECT statement (the count of eligible users) is returned by the function.

To use this function, you would call it with the appropriate parameters:

SELECT getUserIDs('2022-03-08', '2022-03-20', 1000);

This would return the number of users eligible for the discount based on the example input.

Time Complexity Analysis

The time complexity of the SQL query is dominated by the filtering operation in the WHERE clause. In the worst case, the database needs to scan the entire Purchases table. Therefore, the time complexity is O(N), where N is the number of rows in the Purchases table. The COUNT(DISTINCT ...) operation adds a small overhead, but it doesn't change the overall asymptotic complexity. The efficiency depends heavily on the database's indexing and query optimization strategies. If an index exists on time_stamp and/or amount, the query performance will be significantly improved.

Space Complexity Analysis

The space complexity is O(1) because the algorithm uses a constant amount of extra space regardless of the input size. The space used is primarily for storing the intermediate results of the query, which is relatively small compared to the size of the input table.