字节跳动2025年校招笔试手撕真题教程(一)

一、题目

题目内容

小基拿到了一个长度为 2n2n2n 的数组,他希望把数组中的元素分成 nnn 个二元组:(xi,yi)(x_i,y_i)(xi​,yi​)。

每个二元组对应平面直角坐标系的一个点,然后小基希望用一个边和坐标轴平行的矩形将所有点囊括在内。小基希望最终矩形的面积尽可能小,你能帮帮他吗?

输入描述

第一行输入一个正整数 nnn。

第二行输入 2n2n2n 个正整数 aia_iai​,代表数组的元素。

1≤n≤1051\le n\le 10^51≤n≤105

1≤ai≤1091 ≤ a_i \le 10^91≤ai​≤109

输出描述

一个整数,代表矩形的最小面积。

样例1

输入:

|-----|---------------------|
| 1 2 | 2 1 2 3 4 |

输出:

|---|-----|
| 1 | 1 |

说明:(1,4)(1,4)(1,4) 和 (2,3)(2,3)(2,3)

二、分析

为了解决这个问题,我们需要找到一种方法,将数组中的元素分成 n 个二元组,使得由这些二元组形成的点在平面直角坐标系中被一个面积最小的矩形所覆盖。

首先,我们需要理解,要使矩形的面积最小,我们应该尽量使矩形的长和宽尽可能接近。这意味着我们应该尝试将数组中的元素配对,使得最大值和最小值之间的差尽可能小。

具体步骤如下:

  1. 将数组中的 2n 个元素从小到大排序。

  2. 将排序后的数组中的元素两两配对,即第 1 个元素和第 2n 个元素配对,第 2 个元素和第 2n-1 个元素配对,依此类推。这样可以保证每对元素之间的差值尽可能小。

  3. 计算所有配对元素之间的最大差值,这个最大差值就是矩形的长。

  4. 计算所有配对元素之间的最小差值,这个最小差值就是矩形的宽。

  5. 矩形的面积就是长乘以宽。

对于给定的样例:

输入:

1

2

2

1 2 3 4

排序后的数组为:1 2 3 4

配对后的二元组为:(1, 4) 和 (2, 3)

最大差值为 4 - 1 = 3,最小差值为 3 - 2 = 1

因此,矩形的面积为 3 * 1 = 3

但是,题目中给出的输出是 1,这可能是因为题目中存在一些特定的条件或者错误。根据上述解法,正确的输出应该是 3。

三、代码

我们需要将数组中的元素排序,然后将排序后的元素两两配对,这样可以保证每对元素之间的差值尽可能小。接着,计算所有配对元素之间的最大差值和最小差值,这两个差值分别代表矩形的长和宽。矩形的面积就是长和宽的乘积。

python 复制代码
n = int(input())
arr = list(map(int, input().split()))
arr.sort()
max_diff = 0
min_diff = float('inf')
for i in range(n):
    x = arr[i]
    y = arr[2*n - 1 - i]
    diff = y - x
    if diff > max_diff:
        max_diff = diff
    if diff < min_diff:
        min_diff = diff
area = max_diff * min_diff
print(area)

首先读取输入的整数n和数组arr。将数组arr排序,以便后续能够方便地找到最小和最大差值。初始化max_diff为0,min_diff为无穷大。遍历数组,将排序后的数组元素两两配对,计算每对元素之间的差值。更新max_diffmin_diff,分别记录最大的差值和最小的差值。最后计算矩形的面积,即max_diffmin_diff的乘积,并输出结果。该算法的时间复杂度为O(n log n),其中排序操作的时间复杂度为O(n log n),遍历数组的时间复杂度为O(n)。这适用于题目给定的输入范围(n ≤ 1e5)。

四、发散

对于样例:

数组排序后是1 2 3 4

前两个元素1和2作为x坐标,后两个元素3和4作为y坐标

二元组为(1,3)和(2,4)

x坐标的最大值是2,最小值是1,差为1

y坐标的最大值是4,最小值是3,差为1

面积为1*1=1,这与样例的输出相符。

正确的算法步骤如下:

  1. 将数组排序。

  2. 将排序后的数组中的前n个元素作为x坐标,后n个元素作为y坐标。

  3. 将x坐标和y坐标分别排序。

  4. 矩形的左边界是x坐标的最小值,右边界是x坐标的最大值,下边界是y坐标的最小值,上边界是y坐标的最大值。

  5. 面积就是(右边界 - 左边界)*(上边界 - 下边界)。

对于样例:

x坐标是1和2,排序后是1和2,差为1

y坐标是3和4,排序后是3和4,差为1

面积是1*1=1。

这才是正确的解法。之前的分析都存在错误,现在纠正过来。正确的代码如下:

python 复制代码
n = int(input())
arr = list(map(int, input().split()))
arr.sort()
x = arr[:n]
y = arr[n:]
min_x = x[0]
max_x = x[-1]
min_y = y[0]
max_y = y[-1]
area = (max_x - min_x) * (max_y - min_y)
print(area)

对于样例输入:

1

2

2

1 2 3 4

排序后的数组是1 2 3 4

x坐标是1和2,排序后最小值是1,最大值是2,差为1

y坐标是3和4,排序后最小值是3,最大值是4,差为1

面积是1*1=1,符合样例输出。

这个算法的时间复杂度为O(2n log 2n),即O(n log n)。对于题目中的输入范围是可行的。

相关推荐
敲代码的瓦龙24 分钟前
C++?继承!!!
c语言·开发语言·c++·windows·后端·算法
简简单单做算法26 分钟前
基于FPGA的二叉决策树cart算法verilog实现,训练环节采用MATLAB仿真
算法·决策树·fpga开发·cart算法·二叉决策树
白熊18838 分钟前
【机器学习基础】机器学习入门核心算法:K-近邻算法(K-Nearest Neighbors, KNN)
算法·机器学习·近邻算法
北京地铁1号线1 小时前
MMdetection推理验证输出详解(单张图片demo)
前端·算法
oioihoii1 小时前
C++23 新成员函数与字符串类型的改动
算法·c++23
似水এ᭄往昔1 小时前
【数据结构】——二叉树堆(下)
数据结构·算法
GG不是gg1 小时前
Prim算法剖析与py/cpp/java语言实现
算法
秋山落叶万岭花开ღ2 小时前
探索数据结构之顺序表:从入门到精通
数据结构·python·算法
这张生成的图像能检测吗2 小时前
OpenGAN:基于开放数据生成的开放集识别
人工智能·pytorch·深度学习·算法·机器学习·生成对抗网络·聚类
夕泠爱吃糖3 小时前
红黑树,B树,二叉树之间的不同
数据结构·算法·不同树的区别