NC408. 第 K 小的距离对
描述
示例1
输入:
[1,3,1,5],1
输出:
0
说明:
所有距离对有 (1,3) , (1,1),(1,5) ,(3,1),(3,5),(1,5)。其中最小的是 (1,1) ,其距离是 0示例2
输入:
[1,3,1,5],2
输出:
2
说明:
所有距离对有 (1,3) , (1,1),(1,5) ,(3,1),(3,5),(1,5)。其中最小的是 (1,3)(其他距离2也是最小),其距离是 2C++ 解法, 执行用时: 7ms, 内存消耗: 776KB, 提交时间: 2022-05-09
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @param k int整型 * @return int整型 */ int kthDistance(vector<int>& nums, int k) { // write code here sort(nums.begin(), nums.end()); int n = nums.size(); int left = 0, right = nums[n - 1] - nums[0]; while (left < right) { int mid = (left + right) / 2; // 以mid为最大距离的个数 int count = 0; int l = 0, r = 0; for (; r < n; r++) { while (nums[r] - nums[l] > mid) { l++; } count = count + (r - l); } // 如果mid为最大距离大于k的话,说明mid不是最优距离,二分查找区间 if (count >= k) { right = mid; } else { left = mid + 1; } } return left; } };
C++ 解法, 执行用时: 7ms, 内存消耗: 780KB, 提交时间: 2022-08-03
class Solution { public: int kthDistance(vector<int>& nums, int k) { sort(nums.begin(), nums.end()); int h = nums.size(); int L = 0, R = nums[h - 1] - nums[0]; while (L < R) { int mid = (L + R) / 2; int x = 0, y = 0, z = 0; for (; y < h; y++) { while (nums[y] - nums[x] > mid) { x++; } z = z + (y - x); } if (z >= k) { R = mid; } else { L = mid + 1; } } return L; } };
C++ 解法, 执行用时: 7ms, 内存消耗: 784KB, 提交时间: 2022-08-06
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @param k int整型 * @return int整型 */ int kthDistance(vector<int>& nums, int k) { // write code here sort(nums.begin(),nums.end()); int n=nums.size(); int left=0,right=nums[n-1]-nums[0]; while(left<right) { int mid=(left+right)/2; int count=0; int l=0,r=0; for(;r<n;r++) { while(nums[r]-nums[l]>mid) { l++; } count=count+(r-l); } if(count>=k) { right=mid; }else{ left=mid+1; } } return left; } };
C++ 解法, 执行用时: 7ms, 内存消耗: 796KB, 提交时间: 2022-05-12
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @param k int整型 * @return int整型 */ int kthDistance(vector<int>& nums, int k) { // write code here sort(nums.begin(),nums.end()); int l=0; int n=nums.size(); int r=nums[n-1]-nums[0]; while(l<r) { int sum=0; int mid=(r+l)/2; int i=0,j=0; for(;i<n;i++) { while(nums[i]-nums[j]>mid) { j++; } sum+=(i-j); } if(sum>=k) r=mid; else l=mid+1; } return l; } };
C++ 解法, 执行用时: 7ms, 内存消耗: 812KB, 提交时间: 2022-07-24
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @param k int整型 * @return int整型 */ int kthDistance(vector<int>& nums, int k) { // write code here sort(nums.begin(), nums.end()); int n = nums.size(); int l = 0, r = nums[n - 1] - nums[0]; while (l < r) { int count = 0; //以mid为最大距离的个数 int mid = l + (r - l) / 2; int i = 0, j = 0; for (; i < n; ++i) { while(nums[i] - nums[j] > mid) j++; count += (i - j); } // 如果mid为最大距离大于k的话,说明mid不是最优距离,二分查找区间 if (count >= k) r = mid; else l = mid + 1; } return l; } };