通行证
- 积分
- 673
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2017-2-2
- 最后登录
- 1970-1-1
|
感觉这题可以直接用lambda把x附近2k长度的window里的数按照跟x的差值排个序。因为数组本身已经排好序了,所以排序本身基本也是linear的。
LC上通过的代码,速度64%
- vector<int> findClosestElements(vector<int>& arr, int k, int x) {
- size_t headIdx = max(int(lower_bound(arr.begin(), arr.end(), x) - arr.begin()) - k, 0);
- size_t tailIdx = min(int(upper_bound(arr.begin(), arr.end(), x) - arr.begin()) + k, int(arr.size() - 1));
- vector<int> window(arr.begin() + headIdx, arr.begin() + tailIdx + 1); //window是arr里在x两边k距离以内的数
- sort(window.begin(), window.end(), [x](int a, int b) {
- return (abs(a-x) < abs(b-x) || (abs(a-x) == abs(b-x) && a < b));
- });
- window.resize(k); //
- sort(window.begin(), window.begin() + k);
- return window;
- }
复制代码
补充内容 (2017-12-13 15:22):
想了一下不对,要用排序的话,最后有要求按顺序输出k个idx,还得拍次序。 |
|