719. 找出第 k 小的距离对

给定一个整数数组,返回所有数对之间的第 k 个最小距离。一对 (A, B) 的距离被定义为 A 和 B 之间的绝对差值。

示例 1:

输入:
nums = [1,3,1]
k = 1
输出:0 
解释:
所有数对如下:
(1,3) -> 2
(1,1) -> 0
(3,1) -> 2
因此第 1 个最小距离的数对是 (1,1),它们之间的距离为 0。
提示:

2 <= len(nums) <= 10000.
0 <= nums[i] < 1000000.
1 <= k <= len(nums) * (len(nums) - 1) / 2.

解答

这里引用大神的分析:

设数组元素有n个,那么共有n*(n-1)/2个所谓的距离。这些距离的大小是有范围的,即最小的距离必大于等于0,最大的距离为数组的最大元素减去数组的最小元素。题目中所求的第k个最小距离就在其中。
我们可以用二分查找来找到这个目标距离,初始化l=0,r=最大距离。mid=(l+r)/2,计算出距离小于等于mid的数对的个数count。

若count<k,则第k个最小距离不会在[l,mid]之间,故修改l=mid+1;
否则,r=mid;(因为第k个最小距离在[l,mid]之间);

我自己写的具体算法如下:

public int smallestDistancePair(int[] nums, int k) {
        Arrays.sort(nums);
        int len = nums.length;
        int low = 0 ,high = Math.abs(nums[len-1]-nums[0]) ,mid;

        // 二分查找。第k个最小距离在[low,high]之间,在[low,mid],在[mid+1,high]...之间,
        // 在[low(high),low(high)]之间,退出第k个最小距离就等于low
        while (low < high){
            mid = (low+high)/2;
            // 计算nums中距离<=mid的对数(注意是小于等于)
            int pairs = 0;
            // 1.暴力法,最坏的情况下n(n-1)/2的时间复杂度
            for (int i=0;i<len-1;++i){
                for (int j=i+1;j<len;++j){
                    int val = Math.abs(nums[i]-nums[j]);
                    if (val > mid) break;
                    pairs++;
                }
            }

            // 第k个最小距离必定在[mid+1,high]中,所有小于等于mid的距离对数pairs<k,那么pairs后面的距离都是大于mid
            if (pairs < k){
                low = mid + 1;
            }else{
                high = mid;
            }
        }

        return low;
    }

这里计算nums中距离<=mid的对数的时候,算法是穷举法,最坏的时间复杂度达到n(n-1)/2,这对整个算法的效率有很大的影响。关于这个算法后面有时间会分析。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
K邻近模型(K-nearest neighbors model)是一种监督学习算法,可以用于分类和回归问题。对于广告投入对销售额的影响这一问题,可以使用K邻近模型来进行回归分析。 K邻近模型的基本思想是,对于一个新样本点,通过计算其与训练集中所有样本点的距离,并找出其最近的K个邻居。然后,根据这K个邻居的特征或标签来预测该新样本点的销售额。 首先,为了使用K邻近模型进行广告投入对销售额的预测,我们需要收集一定的数据集,包括广告投入金额和对应的销售额。然后,我们将数据集划分为训练集和测试集。 接着,我们需要选择一个适当的K值。较小的K值会使预测结果对局部噪声更敏感,而较大的K值可能会导致模型过于简单。通过交叉验证等方法,我们可以选择一个合适的K值。 然后,我们可以使用K邻近模型来对测试集中的样本进行预测。对于每个测试样本,我们计算其与训练集中各个样本的距离找出最近的K个邻居。 最后,根据这K个邻居的销售额标签,我们可以进行回归分析,计算预测的销售额。通常,我们可以使用平均值或加权平均值作为预测结果。 需要注意的是,K邻近模型的预测结果受到K值的影响,同时也受到特征工程的影响。在实际应用中,我们还可以引入其他特征,如时间、地理位置等,来提高模型的精度。 综上所述,使用K邻近模型可以进行广告投入对销售额的回归分析。但在实际应用中,我们需要选择合适的K值和进行适当的特征工程,以提高模型的准确性和可解释性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值