通行证
- 积分
- 601
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2016-1-24
- 最后登录
- 1970-1-1
|
改了一下- public class Solution {
- public List<Point> kn1(List<Point> pts, int k) {
- Queue<Point> maxheap =
- new PriorityQueue<>((p1, p2) -> (p2.x * p2.x + p2.y * p2.y) - (p1.x * p1.x + p1.y * p1.y));
- for (Point p : pts) { // nlgk
- maxheap.offer(p);
- if (maxheap.size() > k) {
- maxheap.poll();
- }
- }
- return maxheap.stream().collect(Collectors.toList());
- }
- public List<Point> kn2(List<Point> pts, int k) {
- Queue<Point> minheap =
- new PriorityQueue<>((p1, p2) -> (p1.x * p1.x + p1.y * p1.y) - (p2.x * p2.x + p2.y * p2.y));
- minheap.addAll(pts);
- List<Point> ret = new ArrayList<>();
- for (int i = 0; i < k; i++) { // klgn
- ret.add(minheap.poll());
- }
- return ret;
- }
- int comp(Point pt1, Point pt2) {
- return pt1.x * pt1.x + pt1.y * pt1.y - pt2.x * pt2.x - pt2.y * pt2.y;
- }
- int qs(List<Point> arr, int low, int high) {
- Point p = arr.get(high); // high -> p
- while (low < high) {
- while (low < high && comp(arr.get(low), p) <= 0) { // <=
- low++;
- }
- arr.set(high, arr.get(low)); // low -> high
- while (low < high && comp(p, arr.get(high)) <= 0) { // <=
- high--;
- }
- arr.set(low, arr.get(high)); // high -> low
- }
- arr.set(high, p); // p -> high
- return high;
- }
- public List<Point> kn3(List<Point> pts, int k) {
- int low = 0;
- int high = pts.size() - 1;
- while (low < high) {
- int mid = qs(pts, low, high);
- if (mid < k) {
- low = mid + 1;
- } else if (k < mid) {
- high = mid - 1;
- } else { // k == mid
- return pts.subList(0, k);
- }
- }
- return pts.subList(0, k); // low < high
- }
- void recursion(List<Point> pts, int k, int start, int end) {
- int mid = qs(pts, start, end);
- if (mid < k) {
- recursion(pts, k, mid + 1, end);
- } else if (k < mid) {
- recursion(pts, k, start, mid - 1);
- }
- }
- public List<Point> kn3_(List<Point> pts, int k) {
- recursion(pts, k, 0, pts.size() - 1);
- return pts.subList(0, k);
- }
- public static void main(String[] args) {
- Solution s = new Solution();
- List<Point> pts = new ArrayList<>();
- pts.add(new Point(0, 1));
- pts.add(new Point(1, 1));
- pts.add(new Point(2, 2));
- pts.add(new Point(0, 2));
- pts.add(new Point(1, 1));
- Collections.shuffle(pts);
- System.out.println(s.kn1(pts, 3));
- Collections.shuffle(pts);
- System.out.println(s.kn2(pts, 3));
- Collections.shuffle(pts);
- System.out.println(s.kn3(pts, 3));
- Collections.shuffle(pts);
- System.out.println(s.kn3_(pts, 3));
- }
- }
复制代码 |
|