• leetcode-658 找到K个最接近的元素


    “学而不思则惘” 


    题面:给定一个排序好的数组,两个整数 k 和 x,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是按升序排好的。如果有两个数与 x 的差值一样,优先选择数值较小的那个数。

    示例 1:

    输入: [1,2,3,4,5], k=4, x=3
    输出: [1,2,3,4]
     

    示例 2:

    输入: [1,2,3,4,5], k=4, x=-1
    输出: [1,2,3,4]
     

    说明:

    k 的值为正数,且总是小于给定排序数组的长度。
    数组不为空,且长度不超过 104
    数组里的每个元素与 x 的绝对值不超过 104
     

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/find-k-closest-elements

    思路:数组本来是有序的,所以可以使用双下标逼近法去逼近,如果左边靠X近(差值绝对值小),那么右边左移;否则,左边右移。

    时间:O(n)

    空间:O(1)

     1 class Solution {
     2 public:
     3     //时间O(n),空间O(n)
     4    vector<int> findClosestElements1(vector<int>& arr, int k, int x) {
     5         int len = arr.size();
     6         if(len <= 0 || k > len)
     7             return {};
     8         vector<int> res = arr;
     9         while(res.size() > k)
    10         {
    11             if(abs(x-res[0]) > abs(x-res[res.size()-1]))
    12                 res.erase(res.begin());
    13             else
    14                 res.erase(res.end()-1);
    15         }
    16         return res;
    17     }
    18      //时间O(n),空间O(1)
    19     vector<int> findClosestElements(vector<int>& arr, int k, int x) {
    20         int len = arr.size();
    21         if(len <= 0 || k > len)
    22             return {};
    23         
    24         int l = 0, r = len-1;
    25         while((r - l + 1) > k)
    26         {
    27             if(abs(x-arr[l]) > abs(x-arr[r]))
    28                 l++;
    29             else
    30                 r--;
    31         }
    32         return vector<int>(arr.begin()+l, arr.begin()+l+k);
    33     }
    34 };

    灵魂拷问:要是无序数组怎么办?

    先排序,再如法炮制?

    能优化吗?

  • 相关阅读:
    jQuery初级篇
    DOM初级篇
    CSS基础篇
    javascript 初级篇
    HTML 基础篇
    Oracle文章中常用数据表的描述
    Oracle视图基础
    Oracle序列简单应用
    Oracle关联查询关于left/right join的那点事
    赋值和算术运算符
  • 原文地址:https://www.cnblogs.com/yocichen/p/11461215.html
Copyright © 2020-2023  润新知