1471. 数组中的 k 个最强值

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) 的元素。

思路:

1、这道题实质上是判断两端到中位数的距离水大谁小,大的就存入数组中,直到存满k个。
2、双指针,头尾开始判断。

原代码##

class Solution {
public:
    vector<int> getStrongest(vector<int>& arr, int k) {
        int n = arr.size();
        sort(arr.begin(), arr.end());
        int m = arr[(n - 1) / 2]; 
        vector<int> ans;
        int l = 0, r = n - 1;
        while (k > 0 && l <= r) {
            if (arr[r] - m >= m - arr[l]) {
                ans.push_back(arr[r]);
                r--;
            } else {
                ans.push_back(arr[l]);
                l++;
            }
            k--;
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值