Skip to main content

183.从未下订单的客户

标签: hash-table, design

难度: Easy

通过率: 70.02%

原题链接: https://leetcode.com/problems/customers-who-never-order/description/

题目描述

编写一个解决方案,以查找从未下过订单的所有客户。返回的结果表按任意顺序排列。

解题思路

我们可以通过左连接(LEFT JOIN) Customers 表和 Orders 表,然后选择那些在 Orders 表中没有匹配记录的 Customers,来找到从未下订单的客户。具体思路如下:

  1. Customers 表中选择所有客户。
  2. 通过左连接将 Customers 表和 Orders 表连接在一起,条件为 Customers.id = Orders.customerId
  3. 选择连接结果中 Orders.customerId 为空的所有 Customers,这些客户就是从未下订单的客户。

代码实现

# 导入SQLite库
import sqlite3

# 创建内存中的数据库并建立连接
con = sqlite3.connect(':memory:')

# 创建游标对象
cur = con.cursor()

# 创建Customers表
cur.execute('''
CREATE TABLE Customers (
id INT PRIMARY KEY,
name VARCHAR(255)
);
''')

# 创建Orders表
cur.execute('''
CREATE TABLE Orders (
id INT PRIMARY KEY,
customerId INT,
FOREIGN KEY(customerId) REFERENCES Customers(id)
);
''')

# 插入数据到Customers
cur.executemany('INSERT INTO Customers (id, name) VALUES (?, ?);',
[(1, 'Joe'), (2, 'Henry'), (3, 'Sam'), (4, 'Max')])

# 插入数据到Orders
cur.executemany('INSERT INTO Orders (id, customerId) VALUES (?, ?);',
[(1, 3), (2, 1)])

# 执行查询
cur.execute('''
SELECT name
FROM Customers
LEFT JOIN Orders ON Customers.id = Orders.customerId
WHERE Orders.customerId IS NULL;
''')

# 获取结果并打印
result = cur.fetchall()
for row in result:
print(row[0])

# 关闭连接
con.close()

复杂度分析

时间复杂度: O(m+n)O(m + n),其中 mmCustomers 表的条目数,nnOrders 表的条目数。因为我们只需要遍历每个表一次。

空间复杂度: O(1)O(1)。只使用了有限的额外空间。