LeetCode每日一题(Find K Closest Elements)

这篇博客介绍了如何利用优先队列在有序整数数组中找到给定数值x的k个最接近的元素。算法思路是建立一个大小为k的队列,当队列未满时直接插入元素,当队列满时,比较新元素与队首元素与x的绝对差值,根据条件更新队列。最后返回队列内容作为结果。示例代码展示了在Rust语言中实现这一算法的过程。

Given a sorted integer array arr, two integers k and x, return the k closest integers to x in the array. The result should also be sorted in ascending order.

An integer a is closer to x than an integer b if:

  • |a - x| < |b - x|, or
  • |a - x| == |b - x| and a < b

Example 1:

Input: arr = [1,2,3,4,5], k = 4, x = 3
Output: [1,2,3,4]

Example 2:

Input: arr = [1,2,3,4,5], k = 4, x = -1
Output: [1,2,3,4]

Constraints:

  • 1 <= k <= arr.length
  • 1 <= arr.length <= 104
  • arr is sorted in ascending order.
  • -104 <= arr[i], x <= 104

思路:

建一个队列,长度限制为k, 将arr里的数往队列里放, 队列不满k的时候, 直接放进去就好, 长度达到k后,当前的数字n和arr[0]来进行比较, 因为arr是升序所以arr[0]一定是队列里最小的,而n只有满足abs(n-x) < abs(arr[0]-x)的情况时n才是比arr[0]更好的选择,可以入列,然后把arr[0]踢出队列。

代码(Rust):

impl Solution {
    pub fn find_closest_elements(arr: Vec<i32>, k: i32, x: i32) -> Vec<i32> {
        let mut queue = Vec::new();
        for n in arr {
            if queue.len() < k as usize {
                queue.push(n);
            } else {
                if (queue[0] - x).abs() > (n - x).abs() {
                    queue.remove(0);
                    queue.push(n);
                }
            }
        }
        queue
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值