1471. 数组中的 k 个最强值
大约 2 分钟
---
1471. 数组中的 k 个最强值
- 标签:数组、双指针、排序
- 难度:中等
题目链接
题目大意
描述:给定一个整数数组 和一个整数 。定义「强度」为 ,其中 是数组中位数(从小到大排序后第 个元素)。
比较规则:
- 强度大的更强。
- 如果强度相同,值大的更强。
要求:返回数组中 个最强元素(按强度降序,强度相同按值降序)。
说明:
- 。
- 。
示例:
- 示例 1:
输入:arr = [1,2,3,4,5], k = 2
输出:[5,1]
解释:中位数为 3,按从强到弱顺序排序后,数组变为 [5,1,4,2,3]。最强的两个元素是 [5, 1]。[1, 5] 也是正确答案。
注意,尽管 |5 - 3| == |1 - 3| ,但是 5 比 1 更强,因为 5 > 1 。- 示例 2:
输入:arr = [1,1,3,5,5], k = 2
输出:[5,5]
解释:中位数为 3, 按从强到弱顺序排序后,数组变为 [5,5,1,1,3]。最强的两个元素是 [5, 5]。解题思路
思路 1:排序 + 双指针
1. 核心思想
先排序,确定中位数 。然后在排序后的数组两端用双指针取 个最强元素(距离中位数越远越强)。
2. 具体步骤
第 1 步:排序 。
第 2 步:计算中位数索引 ,。
第 3 步:双指针 。循环 次:
- 比较 和 与中位数的距离,取更强的那个(距离相同取值大的)。
- 将结果加入答案,移动指针。
第 4 步:返回结果。
3. 举例说明
以 为例:
排序后:,中位数 。
双指针:
- 比较左边 ()和右边 ():强度相同,值 ,取 ,
- 比较 (强度 )和 (强度 ):取 ,
结果:。
思路 1:代码
class Solution:
def getStrongest(self, arr: List[int], k: int) -> List[int]:
arr.sort()
n = len(arr)
median = arr[(n - 1) // 2]
l, r = 0, n - 1
ans = []
for _ in range(k):
left_dist = abs(arr[l] - median)
right_dist = abs(arr[r] - median)
if right_dist >= left_dist:
ans.append(arr[r])
r -= 1
else:
ans.append(arr[l])
l += 1
return ans思路 1:复杂度分析
- 时间复杂度:,排序。
- 空间复杂度:。