Advertisement
Guest User

658. Find K Closest Elements

a guest
Feb 25th, 2020
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.89 KB | None | 0 0
  1. class Solution {
  2. public:
  3.     int helper(int left, int right, const vector<int>& arr, int x)
  4.     {  
  5.         if (x < arr[0]) return 0;
  6.         if (x > arr[arr.size() - 1]) return arr.size() - 1;
  7.        
  8.         int mid = left + (right - left) / 2;
  9.         if (arr[mid] == x)
  10.         {
  11.             return mid;
  12.         }
  13.         else if (arr[mid] > x)
  14.         {
  15.             if (mid - 1 >= 0 && arr[mid - 1] < x)
  16.             {
  17.                 return abs(x - arr[mid - 1]) < abs(x - arr[mid]) ? mid - 1 : mid;
  18.             }
  19.             return helper(left, mid - 1, arr, x);
  20.         }
  21.         else
  22.         {
  23.             if (mid + 1 < arr.size() && arr[mid + 1] > x)
  24.             {
  25.                 return abs(x - arr[mid + 1]) < abs(x - arr[mid]) ? mid + 1: mid;
  26.             }
  27.             return helper(mid + 1, right, arr, x);
  28.         }
  29.     }
  30.    
  31.     vector<int> findClosestElements(vector<int>& arr, int k, int x) {
  32.         int pos = helper(0, arr.size(), arr, x);
  33.        
  34.         vector<int> result;
  35.         result.reserve(k);
  36.        
  37.         int i = pos;
  38.         int j = pos + 1;
  39.        
  40.         while (result.size() < k)
  41.         {
  42.             if (i >=0 && j <arr.size())
  43.             {
  44.                 if (abs(x - arr[i]) <= abs(x - arr[j]))
  45.                 {
  46.                     result.push_back(arr[i]);
  47.                     i--;
  48.                 }
  49.                 else
  50.                 {
  51.                     result.push_back(arr[j]);
  52.                     j++;
  53.                 }
  54.             }
  55.             else if (i >= 0)
  56.             {
  57.                 result.push_back(arr[i]);
  58.                 i--;
  59.             }
  60.             else
  61.             {
  62.                 result.push_back(arr[j]);
  63.                 j++;
  64.             }
  65.         }
  66.        
  67.         // todo is should be more efficient somehow
  68.         sort(result.begin(), result.end());
  69.         return result;
  70.     }
  71. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement