973. K Closest Points to Origin [Medium]

本文介绍了一种使用快速排序算法寻找二维平面上k个离原点最近的点的方法。通过计算每个点到原点的距离平方并以此作为排序依据,利用快速排序算法特性找到第k个最近的点作为轴点,实现高效查找。

和苏微二面的题有点像,也是按照一个不常规的值来给一组元素做快速排序,找到pivot位置为指定的k时

这道题更简单,不需要构造多个容器

/**
 * 对points快速排序,按照每个point(x, y)的 x^2 + y^2的大小
 * 找到pivotIdx == k的地方,左边的所有点就是答案
 * Runtime: 8 ms, faster than 86.92%
 * Memory Usage: 47.5 MB, less than 72.21%
 */
class Solution {
    public int[][] kClosest(int[][] points, int k) {
        // quick sort
        int left = 0, right = points.length - 1;
        while (left < right) {
            int start = left, end = right, mid = (start + end) / 2;
            int[] pivot = points[mid];
            double pivotVal = Math.pow(pivot[0], 2) + Math.pow(pivot[1], 2);
            points[mid] = points[right];
            while (start < end) {
                while (start < end && Math.pow(points[start][0], 2) + Math.pow(points[start][1], 2) <= pivotVal) {
                    start++;
                }
                points[end] = points[start];
                while (start < end && Math.pow(points[end][0], 2) + Math.pow(points[end][1], 2) >= pivotVal) {
                    end--;
                }
                points[start] = points[end];
            }
            points[start] = pivot;
            if (start == k) {
                break;
            }
            if (start > k) {
                right = start - 1;
            } else {
                left = start + 1;
            }
        }
        
        int[][] res = new int[k][2];
        for (int i = 0; i < k; i++) { // can be replaced with "System.arraycopy(points, 0, res, 0, k);" (submitted and got the same time and space comsumption)
            res[i] = points[i];
        }
        return res;
    }
}
### 寻找深度学习中最近点算法的实现 对于深度学习领域内的最近点查找问题,通常涉及到神经网络架构的设计以及如何高效地处理大规模数据集。在某些特定应用场合下,例如三维点云处理,最近邻搜索成为了一个核心组件。 #### 使用PyTorch实现在深度学习框架下的最近点查询 为了提高效率并充分利用GPU加速,在深度学习环境中执行最近点搜索时常常会采用专门设计的数据结构和技术来优化性能。下面给出了一种利用PyTorch库来进行最近点匹配的方法: ```python import torch from scipy.spatial import KDTree def find_closest_points_pytorch(points_ref, points_query): """ :param points_ref: 参考点集合 Tensor(NxD),N表示数量,D为维度大小 :param points_query: 查询点集合 Tensor(MxD), M表示要查询的数量 :return: 返回最接近于points_query中每个点对应的索引列表 LongTensor(M,) """ device = 'cuda' if torch.cuda.is_available() else 'cpu' tree = KDTree(points_ref.cpu().numpy()) _, indices = tree.query(points_query.cpu().numpy(), k=1) return torch.LongTensor(indices).to(device) ``` 此函数接受两个张量作为输入——`points_ref`代表参考点集而`points_query`则是待查找出其最近邻居的目标点集;最终返回的是一个包含对应关系的一维向量。 #### 针对三维点云处理的应用案例 当面对复杂的几何形状建模任务或是自动驾驶汽车感知周围环境的需求时,三维点云数据变得尤为重要。此时,除了基本的距离度量外还需要考虑其他因素如方向角差异等特性。为此,PointNet++模型被广泛认可用于此类任务,并且在其内部实现了高效的层次化特征提取机制[^1]。 ```python class PointNetSetAbstraction(nn.Module): def __init__(self, npoint, radius_list, nsample_list, in_channel, mlp_list): super(PointNetSetAbstraction).__init__() self.npoint = npoint self.radius_list = radius_list self.nsample_list = nsample_list # 定义多层感知机(MLP)模块... def forward(self, xyz, points=None): new_xyz = index_points(xyz, farthest_point_sample(xyz, self.npoint)) for i in range(len(self.radius_list)): group_idx = query_ball_point(self.radius_list[i], self.nsample_list[i], xyz, new_xyz) grouped_xyz = index_points(xyz, group_idx) ... ``` 上述代码片段展示了PointNet++中的部分逻辑,其中包含了基于球形区域划分策略(`query_ball_point`)的选择过程,从而有效地缩小了候选范围以便更快捷地定位到真正的临近节点[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值