LeetCode 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
。
思路:排序数组,相向双指针
代码:
class Solution {public int[] getStrongest(int[] arr, int k) {Arrays.sort(arr);int n = arr.length;int mid = arr[(n - 1) / 2];int left = 0;int right = n - 1;int[] ans = new int[k];int index = 0;while (index < k) {int leftTmp = Math.abs(arr[left] - mid);int rightTmp = Math.abs(arr[right] - mid);if (leftTmp > rightTmp) {ans[index++] = arr[left];left++;} else {ans[index++] = arr[right];right--;}}return ans;}
}
性能:
时间复杂度o(nlogn)
空间复杂度o(1)排序和返回值开销不计入