TopK 问题

TopK 问题

package p56;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.PriorityQueue;

/**
 * TopK 最小的k个数
 * @author Guozhu Zhu
 * @date 2019/4/13
 * @version 1.0
 *
 */
public class Solution01 {
    
    /* ========== Test ========== */
    public static void main(String[] args) {
        int[] arr = new int[] {1, 3, 2, 4, 6, 5, 9};
        ArrayList<Integer> res = method03(arr, 4);
        System.out.println(res);
    }
    
    //1. quickSort T(o) = nlogn
    public static ArrayList<Integer> method01(int[] arr, int k) {
        ArrayList<Integer> res = new ArrayList<Integer>();
        if (arr.length == 0 || k > arr.length) {
            return res;
        }
        quickSort(arr, 0, arr.length-1);
        for (int i = 0; i < k; i++) {
            res.add(arr[i]);
        }
        return res;
    }
    
    public static void quickSort(int[] arr, int left, int right) {
        if (left > right) {
            return;
        }
        int i = left;
        int j = right;
        int k = arr[left];
        while (i < j) {
            while (i < j && arr[j] >= k) {
                j--;
            }
            arr[i] = arr[j];
            while (i < j && arr[i] <= k) {
                i++;
            }
            arr[j] = arr[i];
        }
        arr[i] = k;
        quickSort(arr, left, i-1);
        quickSort(arr, i+1, right);
    }
    
    //2. 部分排序, 冒泡, T(o) = n*k
    public static ArrayList<Integer> method02(int[] arr, int k) {
        ArrayList<Integer> res = new ArrayList<Integer>();
        if (arr.length == 0 || k > arr.length) {
            return res;
        }
        for (int i = 0; i < k; i++) {
            for (int j = 0; j < arr.length-1-i; j++) {
                if (arr[j+1] > arr[j]) {
                    int temp = arr[j+1];
                    arr[j+1] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        for (int i = arr.length-1; i > arr.length-1-k; i--) {
            res.add(arr[i]);
        }
        return res;
    }
    
    //3. 大顶堆, T(o) = nlogk
    public static ArrayList<Integer> method03(int[] arr, int k) {
        ArrayList<Integer> res = new ArrayList<Integer>();
        if (arr.length == 0 || k > arr.length) {
            return res;
        }
        PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(new Comparator<Integer>() {

            @Override
            public int compare(Integer o1, Integer o2) {
                // TODO Auto-generated method stub
                return o2.compareTo(o1);
            }
        });
        for (int i = 0; i < arr.length; i++) {
            if (maxHeap.size() < k) {
                maxHeap.offer(arr[i]);
            } else if (maxHeap.peek() > arr[i]) {
                maxHeap.poll(); //最大的poll掉
                maxHeap.offer(arr[i]);
            }
        }
        for (Integer i : maxHeap) {
            res.add(i);
        }
        /*for (int i = 0; i < k; i++) {
            res.add(maxHeap.poll());
        }*/
        Collections.reverse(res);
        return res;
    }

}
package p56;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.PriorityQueue;

/**
 * TopK 最大的k个数
 * @author Guozhu Zhu
 * @date 2019/4/13
 * @version 1.0
 *
 */
public class Solution02 {
    
    /* =========== Test ========== */
    public static void main(String[] args) {
        int[] arr = new int[] {1, 4, 3, 2, 9, 8, 0, 5};
        ArrayList<Integer> res = method03(arr, 4);
        System.out.println(res);
    }
    
    //1. 快速排序全排序
    public static ArrayList<Integer> method01(int[] arr, int k) {
        ArrayList<Integer> res = new ArrayList<Integer>();
        if (arr.length == 0 || k > arr.length) {
            return res;
        }
        quickSort(arr, 0, arr.length-1);
        for (int i = arr.length-1; i > arr.length-1-k; i--) {
            res.add(arr[i]);
        }
        return res;
    }
    
    public static void quickSort(int[] arr, int left, int right) {
        if (left > right) {
            return ;
        }
        int i = left;
        int j = right;
        int k = arr[i];
        while (i < j) {
            while (i < j && arr[j] >= k) {
                j--;
            }
            arr[i] = arr[j];
            while (i < j && arr[i] <= k) {
                i++;
            }
            arr[j] = arr[i];
        }
        arr[i] = k;
        quickSort(arr, left, i-1);
        quickSort(arr, i+1, right);
    }
    
    //2. 部分排序,
    public static ArrayList<Integer> method02(int[] arr, int k) {
        ArrayList<Integer> res = new ArrayList<Integer>();
        if (arr.length == 0 || k > arr.length) {
            return res;
        }
        for (int i = 0; i < k; i++) {
            for (int j = 0; j < arr.length-1-i; j++) {
                if (arr[j+1] < arr[j]) {
                    int temp = arr[j+1];
                    arr[j+1] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        for (int i = arr.length-1; i > arr.length-1-k; i--) {
            res.add(arr[i]);
        }
        return res;
    }
    
    //3. 堆排序
    public static ArrayList<Integer> method03(int[] arr, int k) {
        ArrayList<Integer> res = new ArrayList<Integer>();
        if (arr.length == 0 || k > arr.length) {
            return res;
        }
        PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>(new Comparator<Integer>() {

            @Override
            public int compare(Integer o1, Integer o2) {
                // TODO Auto-generated method stub
                return o1.compareTo(o2);
            }
        });
        for (int i = 0; i < arr.length; i++) {
            if (minHeap.size() < k) {
                minHeap.offer(arr[i]);
            } else if (arr[i] > minHeap.peek()) {
                minHeap.poll();
                minHeap.offer(arr[i]);
            }
        }
        for (int i = 0; i < k; i++) {
        	res.add(0, minHeap.poll());
        }
        return res;
    }

}

 

点赞