Advertisement
nikunjsoni

973

May 28th, 2021
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.48 KB | None | 0 0
  1. class Solution {
  2. public:
  3.     vector<vector<int>> kClosest(vector<vector<int>>& points, int k) {
  4.         // Add distance from origin to end of each point.
  5.         for(int i=0; i<points.size(); i++){
  6.             int dist = points[i][0]*points[i][0] + points[i][1]*points[i][1];
  7.             points[i].push_back(dist);
  8.         }
  9.        
  10.         // Do quickselect.
  11.         quickselect(0, points.size()-1, k-1, points);
  12.    
  13.         // Add first k points to result.
  14.         vector<vector<int>> res;
  15.         for(int i=0; i<k; i++)
  16.             res.push_back({points[i][0], points[i][1]});
  17.    
  18.         return res;
  19.     }
  20.    
  21.     void quickselect(int left, int right, int k, vector<vector<int>> &nums){
  22.         if(left == right) return;
  23.         int pivot = partition(left, right, nums);
  24.         if(pivot == k)
  25.             return;
  26.         else if(pivot > k)
  27.             quickselect(left, pivot-1, k, nums);
  28.         else
  29.             quickselect(pivot+1, right, k, nums);
  30.     }
  31.    
  32.     int partition(int left, int right, vector<vector<int>> &nums){
  33.         int pivot = left;
  34.         while(left <= right){
  35.             while(left <= right && nums[left][2] <= nums[pivot][2])
  36.                 left++;
  37.             while(left <= right && nums[right][2] > nums[pivot][2])
  38.                 right--;
  39.        
  40.             if(left < right)
  41.                 swap(nums[left], nums[right]);
  42.             else
  43.                 swap(nums[pivot], nums[right]);
  44.         }
  45.         return right;
  46.     }
  47. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement