Leetcode 719. 找出第 K 小的数对距离
本文最后更新于356 天前,其中的信息可能已经过时,如有错误请发送邮件到2446865563@qq.com

1.题目基本信息

1.1.题目描述

数对 (a,b) 由整数 a 和 b 组成,其数对距离定义为 a 和 b 的绝对差值。

给你一个整数数组 nums 和一个整数 k ,数对由 nums[i] 和 nums[j] 组成且满足 0 <= i < j < nums.length 。返回 所有数对距离中 第 k 小的数对距离。

1.2.题目地址

https://leetcode.cn/problems/find-k-th-smallest-pair-distance/description/

2.解题方法

2.1.解题思路

排序+二分查找+双指针。首先升序排列nums,则所有数对距离都在区间a=[0,nums[-1]-nums[0]]之间;所以题目等价于在区间a中找到最小的x,满足存在k个数对距离小于等于x

2.2.解题步骤

第一步,将nums进行升序排列

第二步,构建函数getCnt获取nums中数对距离小于等于参数x的数对的个数。使用双指针的方法进行计算

第三步,二分查找。红蓝染色。红色为不存在k个数对距离小于等于mid,蓝色为存在。left-1始终指向红色区域,right+1始终指向蓝色区域,最终的left即为题解

3.解题代码

python代码

class Solution:
    def smallestDistancePair(self, nums: List[int], k: int) -> int:
        # 思路:排序+二分查找+双指针。首先升序排列nums,则所有数对距离都在区间a=[0,nums[-1]-nums[0]]之间;所以题目等价于在区间a中找到最小的x,满足存在k个数对距离小于等于x
        n = len(nums)
        # 第一步,将nums进行升序排列
        nums.sort()
        # 第二步,构建函数getCnt获取nums中数对距离小于等于参数x的数对的个数。使用双指针的方法进行计算
        def getCnt(x:int) -> int:
            ans = 0
            j = 0
            for i in range(n):
                while j < n and nums[j] - nums[i] <= x:
                    j += 1
                ans += j - i - 1
            return ans
        # 第三步,二分查找。红蓝染色。红色为不存在k个数对距离小于等于mid,蓝色为存在。left-1始终指向红色区域,right+1始终指向蓝色区域,最终的left即为题解
        left, right = 0, nums[n - 1] - nums[0]
        while left <= right:
            mid = (right - left) // 2 + left
            cnt = getCnt(mid)
            if cnt < k:
                left = mid + 1
            else:
                right = mid - 1
        return left

4.执行结果

觉得有帮助可以投喂下博主哦~感谢!

作者:geek007

转载请注明文章地址及作者哦~
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇