leetcode1471.数组中的k个最强值(python)

1471.数组中的k个最强值

给你一个整数数组arr和一个整数k 。设m为数组的中位数,只要满足下述两个前提之一,就可以判定arr[i]的值比arr[j]的值更强:

| arr[i] - m | > | arr[j] - m |

| arr[i] - m | == | arr[j] - m |,且arr[i] > arr[j]

请返回由数组中最强的k个值组成的列表。答案可以以任意顺序返回。

中位数是一个有序整数列表中处于中间位置的值。形式上,如果列表的长度为n ,那么中位数就是该有序列表(下标从0开始)中位于((n - 1) / 2)

的元素。

例如arr = [6, -3, 7, 2, 11],n = 5:数组排序后得到arr = [-3, 2, 6, 7, 11] ,数组的中间位置为

m = ((5 - 1) / 2) = 2 ,中位数arr[m]的值为6 。

例如arr = [-7, 22, 17, 3],n = 4:数组排序后得到arr = [-7, 3, 17, 22] ,数组的中间位置为

m = ((4 - 1) / 2) = 1 ,中位数arr[m]的值为3 。

示例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]。

示例 3:

输入:arr = [6, 7, 11, 7, 6, 8], k = 5

输出:[11, 8, 6, 6, 7]

解释:中位数为7, 按从强到弱顺序排序后,数组变为[11, 8, 6, 6, 7, 7]。[11, 8, 6, 6, 7]的任何排列都是正确答案。

示例4:

输入:arr = [6, -3, 7, 2, 11], k = 3

输出:[-3, 11, 2]

示例5:

输入:arr = [-7, 22, 17, 3], k = 2

输出:[22, 17]

def func(arr, k):
    n = len(arr)
    arr.sort()
    mid = arr[(n - 1) // 2]
    arr.sort(key=lambda x: (abs(x - mid), x), reverse=True)  # 降序,先按abs(x-mid)排序,相同的情况,按x排序
    return arr[:k]

print(func(arr = [6, -3, 7, 2, 11], k = 3))

# def func(arr, k):
#     n = len(arr)
#     arr.sort()
#     mid = arr[(n - 1) // 2]

#     def sorted_key(x):
#         return (abs(x - mid), x)

#     arr = sorted(arr, key=sorted_key)
#     return arr[n - k:]
# print(func(arr = [6, -3, 7, 2, 11], k = 3))

猜你喜欢

转载自blog.csdn.net/playboygogogo/article/details/108963385
今日推荐