当前位置: 首页 > news >正文

字节跳动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。

三、代码

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

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 - xif diff > max_diff:max_diff = diffif 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。

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

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)。对于题目中的输入范围是可行的。

相关文章:

  • 姓名logo设计在线生成太原整站优化排名外包
  • 网站进入之前动态效果棋牌软件制作开发多少钱
  • 太原做网站费用南通百度seo代理
  • 网站模板 餐饮关键词搜索排名
  • 正规网站模板设计crm系统成功案例分享ppt
  • 企业信息管理信息系统项目优化seo
  • Android应用中设置非系统默认语言(java)
  • 腾讯云国际站可靠性测试
  • Seata分布式事务详解:原理、实现与代码示例
  • 基于PySide6与pycatia的CATIA几何阵列生成器开发实践
  • 【深度学习】2. 从梯度推导到优化策略:反向传播与 SGD, Mini SGD
  • SpringBoot-12-传统MyBatis与JDBC连接MySQL的方式衬托SpringBoot的强大
  • 美团2025年校招笔试真题手撕教程(一)
  • 健身网l;l;j
  • AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年5月25日第88弹
  • 【LCEL深度解析】LangChain表达式语言的工程化实践指南
  • 文件操作(C语言版)
  • DAY36打卡@浙大疏锦行
  • 6.4.2_2最短路径算法-Dijkstra算法
  • redis集群如何迁移
  • Lambda 表达式遍历集合的原理
  • 函数[x]和{x}在数论中的应用
  • Java程序实现了金额数字转大写的功能
  • 【linux】umask权限掩码
  • 李沐《动手学深度学习》| 4.4 模型的选择、过拟合和欠拟合
  • 【linux】全志tina分区表挂载的脚本路径