1471. 数组中的 k 个最强值
思路
说下我的思路
- 先算出中位数
- 遍历数组,算出每个数和中位数的差值,保存
- 同时保存下标,应为当差值相同是,下标也要作为权重的判断依据
- 将数组按规则进行排序
- 返回前k个值
AC!
代码
python
class Solution:
def getStrongest(self, arr, k):
s = sorted(arr)
mindex = (len(s) - 1) // 2
mvalue = s[mindex]
temp = []
for i in s:
temp.append([abs(i-mvalue),i])
def sorttemp(s1,s2):
if s1[0] < s2[0]:
return 1
if s1[0] > s2[0]:
return -1
if s1[0] == s2[0] and s1[1] > s2[1]:
return -1
return 1
return [x[1] for x in sorted(temp, sorttemp)[:k]]
代码(大佬精简版)
python
class Solution:
def getStrongest(self, arr: List[int], k: int) -> List[int]:
n = len(arr)
arr = sorted(arr)
mid = arr[(n - 1) // 2]
def mykey(x):
return (abs(x - mid), x)
arr = sorted(arr, key=mykey)
return arr[n - k:]
改进思路
使用排序+双指针
- 先将数组排序,算出中位数
- 两个指针分别指向排好序的数组的两端
- 应为和中位数的差值最大,也就是距离最远,肯定是越靠近两端的约大
- 比较两个指针的值和下标,分别向中间靠近,得到前k个值,即结果
周赛时考虑上面一种方法写起来较快,而且没有TLE。双指针方法,没有尝试,代码暂略。感兴趣的小伙伴可以尝试一下。