本文共 1265 字,大约阅读时间需要 4 分钟。
给定一个长 l 的列表,里面含的是各个餐馆的坐标。顾客的坐标是 (0, 0)。给定一个正整数 n,先寻找离顾客最近的 n 个餐馆,设这 n 个餐馆离顾客的最远距离是 d,然后再按照列表原来的顺序找到前 n 个距离小于等于 d 的餐馆坐标,将这些坐标返回。如果不足 n 个则返回空列表。这里的距离取欧几里得距离。
首先,将原列表深拷贝一份,然后对新列表排序,找到第 n 个餐馆与顾客的距离 d。然后再遍历原列表,找到前 n 个距离也小于等于 d 的餐馆坐标即可。代码如下:
import java.util.ArrayList;import java.util.List;public class Solution { public List< List< Integer>> nearestRestaurant(List< List< Integer>> restaurant, int n) { if (restaurant.size() == n) { return restaurant; } if (restaurant.size() < n) { return new ArrayList<>(); } List< List< Integer>> res = new ArrayList<>(restaurant); res.sort((r1, r2) -> Integer.compare(disSqr(r1), disSqr(r2))); List< List< Integer>> farthest = res.get(n - 1); int farDisSqr = disSqr(farthest); List< List< Integer>> list = new ArrayList<>(); for (List< Integer> rest : restaurant) { if (disSqr(rest) <= farDisSqr) { list.add(rest); } if (list.size() == n) { break; } } return list; } private int disSqr(List< Integer> rest) { int x = rest.get(0), y = rest.get(1); return x * x + y * y; }}
时间复杂度 O(l log l),空间 O(l)。
转载地址:http://dwjs.baihongyu.com/