python计算坐标点欧式距离_打基础之LeetCode算法题第71篇:二维坐标中的欧式距离问题...

这篇博客从基础算法出发,讲解如何使用C、Python和Java解决LeetCode第973题,即找出给定点集中离原点最近的K个点。通过自定义排序,分别用三种语言实现O(nlogn)复杂度的解决方案,强调简单易懂的代码实现。
摘要由CSDN通过智能技术生成
57e3594c8493cd615830b16fc52f66b2.png

一直很纠结算法的文章应该怎么写。最后觉得还是从最简单的level开始写吧,一开始就弄些重量级的,什么人工智能,机器学习的算法,还要有大量的数学以及优化的知识,小白们估计会很郁闷,当然我也不一定能做出来对吧。

我计划每题给出两种语言的解决方案,一种静态语言,一种动态语言。

我选择C语言,Python和Java作为实现语言,由于篇幅有限,其他语言的实现有兴趣的朋友请自己尝试。

LeetCode 973. 求离原点最近的K个点(K Closest Points to Origin)

问题描述:

在一个平面坐标系中,存在多个点的集合 points,K是一个给定的正整数。求points中到原点(0,0)欧式距离最近的K个点。

注:

  1. 1 <= K <= points.length <= 10000
  2. -10000 < points[i][0] < 10000
  3. -10000 < points[i][1] < 10000

示例:

78c03729b3a8db6a8376ba3331baeb7f.png

C语言实现:

我们用排序算法来解这道题。

排序可能会修改原数据,我们的原则是不修改,所以先copy一份points的副本t,我们对这个副本进行排序。

我们调用qsort来做自定义快速排序,排序是依据是点到原点的欧式距离的大小。

欧式距离的计算是,两点间不同维度的差的平方再相加后再开方。由于我们只是比较大小,开不开方并不影响这个大小的比较,因此最后的开方实际上是不需要的。

副本t被排序后,我们只要取前K个元素返回就可以了。

其他还有解法可以实现O(n),但是比这个要复杂一些,大家可以思考一下。不过我还是推荐这个思路。这个思路很简单,实现容易,代码也比较简洁。因为用到快速排序,所以算法复杂度是O(nlogn),算是不错的了。

代码如下:

36080be519713bac08c1f541228791f5.png
2a8aa073ffa78483e5a5422f7a7c17a4.png

python语言的实现:

python的实现和C语言的原理是一样的,先自定义排序,然后用切片截取前K个元素返回即可。

代码如下:

461b352abcab0d92854321d1bdc74dec.png
13a0661ea6dad7d9e699d333a2344f89.png

Java语言的实现:

Java的实现和C语言的实现相同,但是注意,sort的第二个参数不要直接使用lambda表达式,否则性能至少会降低2倍。

代码如下:

b30bab48364575f26080ef64cf7a3636.png
266a66be0a446d490b10debba98f851c.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值