题目描述
给定一个表 World
+-----------------+------------+--------------+---------------+
| name | continent | area | population |
+-----------------+------------+--------------+---------------+
| Afghanistan | Asia | 652230 | 25500100 |
| Albania | Europe | 28748 | 2831741 |
| Algeria | Africa | 2381741 | 37100000 |
| Andorra | Europe | 468 | 78115 |
| Angola | Africa | 1246700 | 20609294 |
+-----------------+------------+--------------+---------------+
编写一个SQL查询,输出所有大洲(continent)中面积最大的两个国家的名称和面积。
例如,根据上表,查询结果应返回:
+--------------+-------------+--------------+-------------+
| continent | name | area | population |
+--------------+-------------+--------------+-------------+
| Asia | Afghanistan | 652230 | 25500100 |
| Asia | China | 9640011 | 1439323776 |
| Africa | Algeria | 2381741 | 37100000 |
| Africa | Angola | 1246700 | 20609294 |
| Europe | Russia | 17098242 | 143456918 |
| Europe | Kazakhstan | 2724900 | 16718905 |
+--------------+-------------+--------------+-------------+
解题思路
我们需要找出每个大洲中面积最大的两个国家。可以使用ROW_NUMBER()
函数来为每个大洲中的国家进行排序,然后选取前两个即可。
代码实现
MySQL
SELECT name, population, areaFROM worldWHERE area >= 3000000 OR population >= 25000000;
Pandas
import pandas as pddef big_countries(world: pd.DataFrame) -> pd.DataFrame:
df = world[(world['area'] >= 3000000) | (world['population'] >= 25000000)]
return df[['name', 'population', 'area']]
复杂度分析
- 时间复杂度:对于每个大洲,我们需要对该大洲的所有国家按照面积进行排序,然后选取前两个。假设共有n个国家,时间复杂度为O(nlogn)。
- 空间复杂度:使用了常数个额外变量,空间复杂度为O(1)。