iT邦幫忙

2024 iThome 鐵人賽

DAY 14
0
佛心分享-刷題不只是刷題

8月 LeetCode Daily 見聞錄系列 第 14

[8/14] 719. Find K-th Smallest Pair Distance

  • 分享至 

  • xImage
  •  

Hard
Related Topics: Array / Two Pointers / Binary Search / Sorting
LeetCode Source

解題想法

題目是要求我們找到第 k 小的對

而此對必須由 nums 組成

此題是用 binary search 去解

在進行 binary search 之前我們必須先將 nums 排序

之後定義 leftright 為 0 和最大元素建去最小元素的值

接著開始透過 mid = (right - left) / 2 找猜測此值是第幾小的對

count_pairs 會紀錄說目前此猜測值是第幾小的值

回傳 countk 比較

如果 count < kleft = mid + 1

否則 right = m

而最後 left 就是第 k 小的對之值

Complexity

Time Complexity: O(nlogn)
Space Complexity: O(n)

Python

class Solution:
    def smallestDistancePair(self, nums: List[int], k: int) -> int:
        nums.sort()

        def count_pairs(guess: int) -> int:
            count = 0
            j = 0
            for i in range(len(nums)):
                while j < len(nums) and nums[j] - nums[i] <= guess:
                    j += 1
                count += j - i - 1
            return count

        left, right = 0, nums[-1] - nums[0]
        while left < right:
            mid = (left + right) // 2
            if count_pairs(mid) < k:
                left = mid + 1
            else:
                right = mid
        return left

C++

vector.front() 會回傳第一個元素

vector.end() 會回傳最後一個元素

class Solution {
public:
    int smallestDistancePair(vector<int>& nums, int k) {
        sort(nums.begin(), nums.end());

        int l = 0, r = nums.back() - nums.front();

        while (l < r) {
            int m = l + (r - l) / 2;
            if (count_pairs(nums, m) < k)
                l = m + 1;
            else
                r = m;
        }
        return l;
    }

    int count_pairs(vector<int>& nums, int guess) {
        int count = 0, j = 0;
        for (int i = 0; i < nums.size(); i++) {
            while (j < nums.size() && (nums[j] - nums[i] <= guess))
                j += 1;
            count += j - i - 1;
        }
        return count;
    }
};

上一篇
[8/13] 40. Combination Sum II
下一篇
[8/15] 860. Lemonade Change
系列文
8月 LeetCode Daily 見聞錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言