LeetCode数据专题:595. 大的国家

27 阅读1分钟

题目描述

给定一个表 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)。