1407. 排名靠前的旅行者(SQL)

题目:https://leetcode-cn.com/problems/top-travellers/

表单: Users

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| name          | varchar |
+---------------+---------+
id 是该表单主键.
name 是用户名字.
 

表单: Rides

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| user_id       | int     |
| distance      | int     |
+---------------+---------+
id 是该表单主键.
user_id 是本次行程的用户的 id, 而该用户此次行程距离为 distance.
 

写一段 SQL , 报告每个用户的旅行距离.

返回的结果表单,  以 travelled_distance 降序排列, 如果有两个或者更多的用户旅行了相同的距离, 那么再以 name 升序排列.

查询结果格式, 如下例所示.

 

Users 表单:
+------+-----------+
| id   | name      |
+------+-----------+
| 1    | Alice     |
| 2    | Bob       |
| 3    | Alex      |
| 4    | Donald    |
| 7    | Lee       |
| 13   | Jonathan  |
| 19   | Elvis     |
+------+-----------+

Rides 表单:
+------+----------+----------+
| id   | user_id  | distance |
+------+----------+----------+
| 1    | 1        | 120      |
| 2    | 2        | 317      |
| 3    | 3        | 222      |
| 4    | 7        | 100      |
| 5    | 13       | 312      |
| 6    | 19       | 50       |
| 7    | 7        | 120      |
| 8    | 19       | 400      |
| 9    | 7        | 230      |
+------+----------+----------+

Result 表单:
+----------+--------------------+
| name     | travelled_distance |
+----------+--------------------+
| Elvis    | 450                |
| Lee      | 450                |
| Bob      | 317                |
| Jonathan | 312                |
| Alex     | 222                |
| Alice    | 120                |
| Donald   | 0                  |
+----------+--------------------+
Elvis 和 Lee 旅行了 450 英里, Elvis 是排名靠前的旅行者, 因为他的名字在字母表上的排序比 Lee 更小.
Bob, Jonathan, Alex 和 Alice 只有一次行程, 我们只按此次行程的全部距离对他们排序.
Donald 没有任何行程, 他的旅行距离为 0.

 

 

代码:

SELECT U.name, ifnull(sum(R.distance),0) as travelled_distance FROM Users U LEFT JOIN Rides R ON U.id = R.user_id GROUP BY R.user_id ORDER BY travelled_distance DESC, name 

需注意Donald没有旅行距离,不能用inner join,且需判断为null情况置0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
旅行者的背包问题是一个经典的组合优化问题,也被称为0-1背包问题。在这个问题中,有一个旅行者要去旅行,他有一个背包,背包有一定的容量限制。旅行者需要选择一些物品放入背包中,每个物品有自己的重量和价值。旅行者的目标是在不超过背包容量的提下,使得背包中物品的总价值最大化。 在Python中,可以使用动态规划算法来解决旅行者的背包问题。具体步骤如下: 1. 创建一个二维数组dp,其中dp[i][j]表示在i个物品中,背包容量为j时的最大总价值。 2. 初始化dp数组的第一行和第一列为0,表示没有物品或者背包容量为0时的最大总价值都为0。 3. 遍历物品列表,对于每个物品i: - 如果物品i的重量大于当背包容量j,则dp[i][j]等于dp[i-1][j],即不选择物品i。 - 如果物品i的重量小于等于当背包容量j,则dp[i][j]等于max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]),其中w[i]表示物品i的重量,v[i]表示物品i的价值。 4. 最终的最大总价值为dp[n][C],其中n为物品的个数,C为背包的容量。 下面是一个简单的Python代码示例: ```python def knapsack(weights, values, capacity): n = len(weights) dp = [ * (capacity + 1) for _ in range(n + 1)] for i in range(1, n + 1): for j in range(1, capacity + 1): if weights[i - 1] > j: dp[i][j] = dp[i - 1][j] else: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weights[i - 1]] + values[i - 1]) return dp[n][capacity] ``` 使用以上代码,你可以传入物品的重量列表`weights`、价值列表`values`和背包的容量`capacity`,即可得到旅行者背包问题的最大总价值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值